zoukankan      html  css  js  c++  java
  • 【iOS】代理传值与块代码传值

    主线程与子线程经常需要进行数据的传递,不同的类之间,不同的控制器之间都需要。

    而且经常需要监听一个动作的完成,而后才去做相应事件。(代理是一对一的关系)。

    一、代理传值

    代理是一种设计模式。iOS中用的非常多。可以通过自定义代理来进行传值。

    参见我的这篇文章 http://blog.csdn.net/xn4545945/article/details/31036523

    在iOS中,委托方与被委托方都要实现3个步骤。(见代码注释)

    下面代码:模拟下载完成后需要更新UI. 用代理来传值.

    XNUpload.h

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #import <Foundation/Foundation.h>  
    2.   
    3. //1.定义代理协议  
    4. @protocol XNUploadDelegate <NSObject>  
    5. - (void)downloadFinshed:(NSString *)param;  
    6. @end  
    7.   
    8.   
    9. @interface XNUpload : NSObject  
    10. //2.定义代理属性  
    11. @property (nonatomic, assign) id <XNUploadDelegate> delegate;  
    12.   
    13. -(void)download;  
    14. @end  


    XNUpload.m

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #import "XNUpload.h"  
    2.   
    3. @implementation XNUpload  
    4. /** 
    5.  *  模拟下载完成后需要更新UI 
    6.  */  
    7. - (void)download {  
    8.     NSLog(@"正在下载....");  
    9.     sleep(3.0);  
    10.     NSLog(@"下载完成!");  
    11.     //3.往主线程中更新UI, 需要传递参数. 通知主线程下载完成. (调用代理方法)  
    12.     [self.delegate downloadFinshed:@"下载完成啦!"];  
    13. }  
    14.   
    15. @end  


    XNViewController.m

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #import "XNViewController.h"  
    2. #import "XNUpload.h"  
    3.   
    4. @interface XNViewController () <XNUploadDelegate> //1. 遵守代理协议  
    5.   
    6. @end  
    7.   
    8. @implementation XNViewController  
    9. - (void)viewDidLoad {  
    10.     [super viewDidLoad];  
    11.     XNUpload *upload = [[XNUpload alloc] init];  
    12.     [upload download];   //下载了  
    13.   
    14.     //2. 设置代理  
    15.     upload.delegate = self;  
    16. }  
    17.   
    18. //3.实现代理方法. 这个方法里面就表明下载完成了.  
    19. - (void)downloadFinshed:(NSString *)param {  
    20.     NSLog(@"%@", param);  
    21. }  
    22.   
    23. @end  


    二、块代码传值

    块代码传值更加简便,且代码更加紧凑,更方便。多线程中用块代码更加普遍。

    使用注意 :
    1.当不设置block而传入nil时,会报野指针excbadaccess. (解决:判断一下,if(xx){..})
    2.block中执行应该回主线程去更新UI,到里面dispatch一下.
    3.苹果建议所有的块代码定义都不要放在头文件中.(解决:直接在使用块代码的来个匿名的就OK)
    *好处:能避免自己定义的块代码名与苹果内置的冲突重名.
     
    代码如下:
    XNUpload.h
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #import <Foundation/Foundation.h>  
    2.   
    3.   
    4. @interface XNUpload : NSObject  
    5. - (void)download:(void (^)(NSString *param))completion;  
    6. @end  


    XNUpload.m

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #import "XNUpload.h"  
    2.   
    3. @implementation XNUpload  
    4. /** 
    5.  *  模拟下载完成后需要更新UI. 使用块代码. 
    6.  */  
    7. - (void)download:(void (^)(NSString *param))completion { //1.在参数中定义块代码  
    8.     NSLog(@"正在下载....");  
    9.     sleep(3.0);  
    10.     NSLog(@"下载完成!");  
    11.     //往主线程中更新UI, 需要传递参数. 通知主线程下载完成. (使用块代码)  
    12.     if (completion) {  
    13.         //这样可以让调用者不用关心线程问题  
    14.         dispatch_async(dispatch_get_main_queue(), ^{  
    15.             completion(@"下载完成!");  //2.执行块代码  
    16.         });  
    17.     }  
    18. }  
    19.   
    20. @end  


    XNViewController.m

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. #import "XNViewController.h"  
    2. #import "XNUpload.h"  
    3.   
    4. @interface XNViewController ()  
    5.   
    6. @end  
    7.   
    8. @implementation XNViewController  
    9.   
    10. - (void)viewDidLoad {  
    11.     [super viewDidLoad];  
    12.     XNUpload *upload = [[XNUpload alloc] init];  
    13.   
    14.     //直接调用方法即可  
    15.     [upload download: ^(NSString *param) {  
    16.         NSLog(@"%@", [NSThread currentThread]);  
    17.         NSLog(@"%@", param);  
    18.     }];  
    19. }  
    20.   
    21. @end  


    块代码与代理比较,用起来简单很多,很方便。

    转载请注明出处:http://blog.csdn.net/xn4545945  

  • 相关阅读:
    【BZOJ4448】【SCOI2015】情报传递
    【BZOJ2006】【NOI2010】超级钢琴
    NOIp2018模拟赛四十五~??
    【BZOJ4940】【YNOI2016】这是我自己的发明
    数据迁移—datax
    DG模拟GAP手动处理
    DG问题:ORA-16416: No viable Physical Standby switchover targets available
    管理和维护DG
    DG问题
    DG概念与机制
  • 原文地址:https://www.cnblogs.com/Sucri/p/5091435.html
Copyright © 2011-2022 走看看