• 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
    
    
    
    

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

  • 相关阅读:
    java:数组操作工具类 java.util.Arrays包 主要方法详解
    java:接口特性 接口与抽象类/普通类的区别
    mybatis教程:入门>>精通>>实战
    Java :内部类基础详解
    Java swing: 实现ActionListener监听器的三种途径
    Java:final、static关键字 详解+两者结合使用
    Java:双括号初始化 /匿名内部类初始化法
    Java:静态内部类的使用目的、使用限制、与非静态内部类的对比
    域名解析>>"记录类型" 说明
    Java:接口继承接口 (多继承机制)
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5422883.html
Copyright © 2020-2023  润新知