一、请简述AFNetWorking的实现原理。
虽然运行效率没有ASI高,但是使用比ASI简单。是对NSURLConnection和NSURLSession的各自的一层包装,AFN内部开了一条专门用来访问网络请求的线程,在这个开线程的方法中,他把方法和dispatch_once都用static修饰了下,以保证这个方法的安全性以及只开辟一块内存空间,而且保证他线程不死。在这个方法中他会调用另一个网络请求入口的方法,在这个入口方法中他会创建一个RunLoop,然后添加一个NSMachPort端口,目的是为了让他里面有Source(因为有了Source的RunLoop才能真正跑起来)。然后启动RunLoop,通过RunLoop在里面不断的循环,不断的发送消息,让他做事情.
二、你如何理解Block,Block有什么用途。
block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的。
Block的定义:
int (^myBlock) (int a,int b) = ^(int a,int b)
{
return a+b;
};
定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?
Block可以访问局部变量,但是不能修改。比如下面的代码就会报编译错
int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
如果要修改就要加关键字:_block (注意,是两个下划线"")
__block int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时block里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
下面说一下block是怎样做异步处理的。
假设A有一个任务,是去仓库取一张A4纸放到会议室,然后在纸上写一份策划书。取纸又要经过仓库管理员,于是A通知仓库管理员来张纸过来。由于管理员是个老头动作很慢,另外A还有其他工作,如果一直等待管理员就太浪费时间了,合理的做法是让仓库管理员进行取纸这项工作,A在通知管理员后就继续自己的工作。A不知道仓库管理员什么时候能完成取纸,也就不知道什么时候可以在纸上写策划书。这时block机制就派上用场了,使用这种机制,可以让A在通知仓库管理员取纸的同时,告诉仓库管理员将纸放到编号XX会议室,并安排好将要在纸上写的策划内容,当管理员把纸拿来后,可能过一会就会有个助理将策划内容写到纸上。
- (void)btnLoginWeiboClicked:(id)sender
{
[_waitCircle startAnimating];
[[HSLoginClass createInstance] loginWithPlatformType:ShareTypeSinaWeibo withBlock:^(BOOL success, id message) {
if (success) {
//跳出登录页面
[self dismissViewControllerAnimated:YES completion:^{}];
[_waitCircle stopAnimating];
NSLog(@"新浪微博 %@", message);
}
else {
}
}];
//test statistics
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSDate* date = [NSDate date];
NSTimeInterval nowTime = [date timeIntervalSince1970];
NSString* netStatus = (NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:NETSTATUS];
[[HSStatisticsModule statisticsModule] makeSession:nowTime :OPER_IN :@"noid"];
[[HSStatisticsModule statisticsModule] upLoadData:netStatus :[NSString stringWithFormat:@"%f", nowTime]];
});
}
整个方法是A要做的工作,startAnimating/loginWithPlatformType/dispatch_async分别是A要做的三个任务,由于loginWithPlatformType需要一段时间才能完成,并且loginWithPlatformType完成后要根据结果做相应处理,所以我们对loginWithPlatformType进行异步处理。block代码段是loginWithPlatformType得到结果后要做的操作H,这里的block写法就表示,我们先将操作H安排好,然后继续其他工作,当loginWithPlatformType执行ok后自会有人(可能是那个助理)去执行操作H。