好好学习,天天向上。
阅读地址:http://www.cocoachina.com/ios/20150927/13525.html
如有侵权,请告知,马上删除。
黑色为摘抄片段,红色为自己的理解。
1.大多数delegate protocols 都拥有几个消息源。
例如:需要的block需要的参数不同,复用造成意义不明。
这个时候使用delegate比较合适。
其实通过定义多个block也能实现,并且多个block也能定义不同的名字。但是如果消息源实在太多的话,还是利用delegate更加合适。
2.一个对象只能有一个delegate。
如果一个对象是单例,不要使用delegation。
每个对象只有一个delegate,但是如果需要把消息传递给多个人的话,每次都需要设置代理,并且遵守协议,并实现方法,使代码增多。这种情况下如果使用block,回调的消息只会进最近执行的一个方法的block中,代码量缩小很多。
3.一般的delegate方法会有返回值
如果对象的请求带有附加信息,更应该使用delegation
block回调不通过return返回结果。而是通过参数来进行返回如下,本应如此。
- (void)doSomeThingComplete:(void(^)(NSData *data))complete
{
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@"test"];
NSData *data = [NSData dataWithContentsOfURL:url];
if(complete) {
complete(data);
}
});
}
- (void)test
{
[self doSomeThingComplete:^(NSData *data) {
NSLog(@"%@",data);
}];
}
4.过程 vs 结果(Process vs. Results)
delegate的回调更多的面向过程,而block则是面向结果的。
如果你使用block去请求一个可能失败的请求,你应当只使用一个block。
通过block或者delegate其实都可以回调出个个阶段的信息,但是在设计之初,block感觉就是用于简化,略去过程的,所以block感觉正式面向结果的。