-
利用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
访问网络要异步执行,主队列要异步执行,同步会卡住,死锁