欢迎加入【iOS/Swift/OC开发交流群|127183325】交流学习
关于我们在开发的时候是用Block还是Delegate,网上已经有了很多的讨论,个人感觉这一篇很不错,开发该选择Blocks还是Delegates,原文地址在这,推荐大家看看。所以,在此就不细说是选择Blocks还是Delegates了,只将关键点放这,更详细的内容可以点击上面放的链接查阅。
- 大多数delegate protocols 都拥有几个消息源。
- 一个对象只能有一个delegate。
- 一般的delegate方法会有返回值。
- Delegates更关注过程,Blocks更关注结果。
如果能在开发中遵循以上几点的话,Blocks和Delegate基本上就不会用在不合适的地方了,是不是挺简单的。
但是我们应该从这篇文章中获得更多的内容。比如,如果再遇到类似的疑惑,我们应该怎么做。首先,我们可以在搜索引擎中直接搜索,这是最简单也是最直接的方法。在开发中我们遇到的大部分的问题在网上都能查到相关的解决方案,我们应该更好的利用这个巨大的知识库。其次,如过很不巧的我们遇到了别人没有遇到的问题,首先,这得恭喜你,因为你走到了大部分开发者的前面,如过你能找到好的解决方法,你会从中学到很多。另外,要解决这样的问题需要花费更多的时间和精力,最终结果只有两种,解决或者没有解决。
在上面提到的文章中给了我们一个很好的示范。我们要利用好苹果的官方文档,在官方文档中我们不仅仅能了解各种API的用法,更重要的是我们还能在文档中看到苹果官方在编程中的习惯,这个习惯能给我们一个很好的参考。
下面看一下我在1.0 版本中使用的Blocks,以及为什么要在2.0种放弃使用它。
这是一段文件传输的代码:
[[FBSocketTool shareInstance] sendTCPData:transferDatasArray[fileDataIndex] withTag:tag didWritePartialDataOfLengthBlock:^(NSUInteger partialLength) { sendSize += partialLength; CGFloat progress = (sendSize*1.0/allFilesSize)*100; [[NSNotificationCenter defaultCenter] postNotificationName:FBUpdateNavigationBarProgress object:[NSNumber numberWithFloat:progress]]; }];
方法的实现:
- (void)sendTCPData:(NSData *)data withTag:(long)tag didWritePartialDataOfLengthBlock:(void (^)(NSUInteger))block { if (self.TCPSocket.isConnected) { self.WritePartialDataOfLengthBlock = block; [self.TCPSocket writeData:data withTimeout:-1 tag:tag]; }else { NSLog(@"socket未连接"); } }
为了能获取文件传输的进度,专门创建了一个Block
@property (nonatomic, copy)void (^WritePartialDataOfLengthBlock)(NSUInteger partialLength);
很明显,我们在上传文件的时候需要获取传输的三个状态:开始传输,传输中和传输结束。根据我们查看苹果的官方文档,这个地方最好的方法还是使用Delegates来实现,所以在2.0中根据上面总结的几点做了一些修改。