【iOS】代理傳值與塊代碼傳值
阿新 • • 發佈:2017-05-17
ring 方法 nslog 設置代理 轉載 adf delegate alloc 代理傳值
XNUpload.m
XNViewController.m
二、塊代碼傳值
代碼例如以下: XNUpload.h
XNUpload.m
XNViewController.m
塊代碼與代理比較。用起來簡單非常多,非常方便。
主線程與子線程常常須要進行數據的傳遞。不同的類之間,不同的控制器之間都須要。
並且常常須要監聽一個動作的完畢。而後才去做對應事件。
(代理是一對一的關系)。
一、代理傳值
代理是一種設計模式。
iOS中用的許多。能夠通過自己定義代理來進行傳值。
參見我的這篇文章 http://blog.csdn.net/xn4545945/article/details/31036523
在iOS中。托付方與被托付方都要實現3個步驟。(見代碼凝視)
以下代碼:模擬下載完畢後須要更新UI. 用代理來傳值.
XNUpload.h
#import <Foundation/Foundation.h> //1.定義代理協議 @protocol XNUploadDelegate <NSObject> - (void)downloadFinshed:(NSString *)param; @end @interface XNUpload : NSObject //2.定義代理屬性 @property (nonatomic, assign) id <XNUploadDelegate> delegate; -(void)download; @end
XNUpload.m
#import "XNUpload.h" @implementation XNUpload /** * 模擬下載完畢後須要更新UI */ - (void)download { NSLog(@"正在下載...."); sleep(3.0); NSLog(@"下載完畢!"); //3.往主線程中更新UI, 須要傳遞參數. 通知主線程下載完畢. (調用代理方法) [self.delegate downloadFinshed:@"下載完畢啦!"]; } @end
XNViewController.m
#import "XNViewController.h" #import "XNUpload.h" @interface XNViewController () <XNUploadDelegate> //1. 遵守代理協議 @end @implementation XNViewController - (void)viewDidLoad { [super viewDidLoad]; XNUpload *upload = [[XNUpload alloc] init]; [upload download]; //下載了 //2. 設置代理 upload.delegate = self; } //3.實現代理方法. 這種方法裏面就表明下載完畢了. - (void)downloadFinshed:(NSString *)param { NSLog(@"%@", param); } @end
二、塊代碼傳值
塊代碼傳值更加簡便,且代碼更加緊湊。更方便。多線程中用塊代碼更加普遍。
使用註意 : 1.當不設置block而傳入nil時,會報野指針excbadaccess. (解決:推斷一下,if(xx){..}) 2.block中運行應該回主線程去更新UI,到裏面dispatch一下. 3.蘋果建議全部的塊代碼定義都不要放在頭文件中.(解決:直接在使用塊代碼的來個匿名的就OK) *優點:能避免自定義的塊代碼名與蘋果內置的沖突重名.代碼例如以下: XNUpload.h
#import <Foundation/Foundation.h> @interface XNUpload : NSObject - (void)download:(void (^)(NSString *param))completion; @end
XNUpload.m
#import "XNUpload.h" @implementation XNUpload /** * 模擬下載完畢後須要更新UI. 使用塊代碼. */ - (void)download:(void (^)(NSString *param))completion { //1.在參數中定義塊代碼 NSLog(@"正在下載...."); sleep(3.0); NSLog(@"下載完畢!"); //往主線程中更新UI, 須要傳遞參數. 通知主線程下載完畢. (使用塊代碼) if (completion) { //這樣能夠讓調用者不用關心線程問題 dispatch_async(dispatch_get_main_queue(), ^{ completion(@"下載完畢!"); //2.運行塊代碼 }); } } @end
XNViewController.m
#import "XNViewController.h" #import "XNUpload.h" @interface XNViewController () @end @implementation XNViewController - (void)viewDidLoad { [super viewDidLoad]; XNUpload *upload = [[XNUpload alloc] init]; //直接調用方法就可以 [upload download: ^(NSString *param) { NSLog(@"%@", [NSThread currentThread]); NSLog(@"%@", param); }]; } @end
塊代碼與代理比較。用起來簡單非常多,非常方便。
轉載請註明出處:http://blog.csdn.net/xn4545945
【iOS】代理傳值與塊代碼傳值