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  

  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/Sucri/p/5091435.html
Copyright © 2011-2022 走看看