主線程與子線程經常需要進行數據的傳遞,不同的類之間,不同的控制器之間都需要。
而且經常需要監聽一個動作的完成,而後纔去做相應事件。(代理是一對一的關係)。
一、代理傳值
代理是一種設計模式。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
二、塊代碼傳值
塊代碼傳值更加簡便,且代碼更加緊湊,更方便。多線程中用塊代碼更加普遍。
#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