美文网首页
AFNetWorking的实现原理以及Block用途

AFNetWorking的实现原理以及Block用途

作者: 陪你看日出去 | 来源:发表于2016-07-06 20:26 被阅读102次

    一、请简述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。

    相关文章

      网友评论

          本文标题:AFNetWorking的实现原理以及Block用途

          本文链接:https://www.haomeiwen.com/subject/afwkjttx.html