1. 程式人生 > >【iOS】代理傳值與塊代碼傳值

【iOS】代理傳值與塊代碼傳值

ring 方法 nslog 設置代理 轉載 adf delegate alloc 代理傳值

主線程與子線程常常須要進行數據的傳遞。不同的類之間,不同的控制器之間都須要。

並且常常須要監聽一個動作的完畢。而後才去做對應事件。

(代理是一對一的關系)。


一、代理傳值

代理是一種設計模式。

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】代理傳值與塊代碼傳值