zoukankan      html  css  js  c++  java
  • ios每日一发--Leanclude数据云存储以及登录 注册账户

    • 利用LeanCloud来实现注册账号,存储账号以及,登录时查询账号是否正确.集成方式很简单可以看这里的官方文档.地址是这里: https://leancloud.cn/docs/

    • 在这里创建应用,以及设置一个应用自己的数据库.非常方便.还可以看到你的应用访问数据的次数等等.

    • 首先根据官方文档集成官方sdk包以后再appdelegate中进行授权(一切按照官方指示)

    • 进入正题.先上代码.

    • // AppDelegate.m文件

    
    //
    //  AppDelegate.m
    //  LoginView
    //
    //  Created by 裴波波 on 16/4/21.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import "AppDelegate.h"
    #import <AVOSCloud/AVOSCloud.h>
    
    
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        // applicationId 即 App Id,clientKey 是 App Key。
        //这里的id 以及 key 都是在leancloud中创建应用以后提供的,用来访问leancloud统计以及授权
        [AVOSCloud setApplicationId:@"GCyStwB6xVWMfvLiGktfTu4p-gzGzoHsz	"
                          clientKey:@"bNJj02mLLUbtbQyExkCLw9yM"];
        //跟踪应用打开情况
        [AVAnalytics trackAppOpenedWithLaunchOptions:launchOptions];
        return YES;
    }
    
    
    
    @end
    
    
    
    
    • 主控制器中
    
    //
    //  ViewController.m
    //  LoginView
    //
    //  Created by 裴波波 on 16/4/21.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <AVOSCloud/AVOSCloud.h>
    #import "PBViewController.h"
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UITextField *txtUserName;
    
    @property (weak, nonatomic) IBOutlet UITextField *txtPassword;
    
    @end
    
    
    @implementation ViewController
    
    #pragma mark - 注册用户
    - (IBAction)clcikRegisterUsers:(id)sender {
        
        //获取用户输入字符
        NSString * name = self.txtUserName.text;
        NSString * pwd = self.txtPassword.text;
        NSLog(@"name : %@ pwd : %@",name,pwd);
        
        //将注册内容 异步 写到云
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            AVObject *post = [AVObject objectWithClassName:@"PBBUsers"];
            [post setObject:pwd forKey:name];
            [post saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                if (succeeded) {
                    // 保存成功了!
                    NSLog(@"账户保存成功");
                }
            }];
        });
    }
    
    #pragma mark - 点击登录
    - (IBAction)clcikLoginBtn:(id)sender {
        
        //获取用户输入字符
        NSString * name = self.txtUserName.text;
        NSString * pwd = self.txtPassword.text;
        NSLog(@"name : %@ pwd : %@",name,pwd);
        
        
        //异步访问网络验证账号密码
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            //联网查询用户名密码
            //数据查询
            AVQuery *query = [AVQuery queryWithClassName:@"PBBUsers"];
            //    [query whereKey:@"words" equalTo:@"Hello World!"];
            [query whereKey:name equalTo:pwd];
            [query getFirstObjectInBackgroundWithBlock:^(AVObject *object, NSError *error) {
                // object 就是符合条件的第一个 AVObject
                if (error) {
                    NSLog(@"%@",error);
                    NSLog(@"账号或者密码错误");
                    return;
                }
                NSString * str = object[@"words"];
                NSLog(@"%@",str);
                
                //跳转到主线程执行
                dispatch_async(dispatch_get_main_queue(), ^{
                    PBViewController * vc = [PBViewController new];
                    [self.navigationController pushViewController:vc animated:YES];
                });
            }];
        });
    }
    
    
    • 这里的注意点是: 当点击登录按钮时要进行网络访问数据,看云存储的账号与密码是否匹配.是一个耗时操作,要异步执行否则会堵塞主线程,卡主界面.
    • 第二点:由于要跳转控制器,要把跳转控制器的代码放在主队列中执行,并且是异步执行,主队列同步执行会造成死锁,也就是 线程相互等待,而卡住主线程.
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
        //测试存储
        //    AVObject *post = [AVObject objectWithClassName:@"TestObject"];
        //    [post setObject:@"Hello World!" forKey:@"words"];
        //    [post saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        //        if (succeeded) {
        //            // 保存成功了!
        //        }
        //    }];
    }
    
    //-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //
    //    //数据查询
    //    AVQuery *query = [AVQuery queryWithClassName:@"TestObject"];
    //    [query whereKey:@"words" equalTo:@"Hello World!"];
    //    [query getFirstObjectInBackgroundWithBlock:^(AVObject *object, NSError *error) {
    //        // object 就是符合条件的第一个 AVObject
    //        if (error) {
    //            NSLog(@"%@",error);
    //            return;
    //        }
    //        NSString * str = object[@"words"];
    //        NSLog(@"%@",str);
    //    }];
    //}
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    
    
    
    

    访问网络要异步执行,主队列要异步执行,同步会卡住,死锁

  • 相关阅读:
    EL表达式(Expression Language)
    JSP简单功能介绍
    MySQL基础使用
    JDBC
    MySQL安装卸载
    stanfordnlp dependencies(依存关系简写表)
    不需要深度学习就能做的文本分类器
    词向量的cbow模型
    pytorch实现自己的textCNN
    OpenCV编译viz模块
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5422883.html
Copyright © 2011-2022 走看看