歡迎加入【iOS/Swift/OC開發(fā)交流群|127183325】交流學習
關于我們在開發(fā)的時候是用Block還是Delegate失都,網(wǎng)上已經(jīng)有了很多的討論匿级,個人感覺這一篇很不錯,開發(fā)該選擇Blocks還是Delegates媳板,原文地址在這桑腮,推薦大家看看。所以蛉幸,在此就不細說是選擇Blocks還是Delegates了破讨,只將關鍵點放這丛晦,更詳細的內容可以點擊上面放的鏈接查閱。
- 大多數(shù)delegate protocols 都擁有幾個消息源提陶。
- 一個對象只能有一個delegate烫沙。
- 一般的delegate方法會有返回值。
- Delegates更關注過程隙笆,Blocks更關注結果锌蓄。
如果能在開發(fā)中遵循以上幾點的話,Blocks和Delegate基本上就不會用在不合適的地方了撑柔,是不是挺簡單的瘸爽。
但是我們應該從這篇文章中獲得更多的內容。比如乏冀,如果再遇到類似的疑惑蝶糯,我們應該怎么做。首先辆沦,我們可以在搜索引擎中直接搜索昼捍,這是最簡單也是最直接的方法。在開發(fā)中我們遇到的大部分的問題在網(wǎng)上都能查到相關的解決方案肢扯,我們應該更好的利用這個巨大的知識庫妒茬。其次,如過很不巧的我們遇到了別人沒有遇到的問題蔚晨,首先乍钻,這得恭喜你,因為你走到了大部分開發(fā)者的前面铭腕,如過你能找到好的解決方法银择,你會從中學到很多。另外累舷,要解決這樣的問題需要花費更多的時間和精力浩考,最終結果只有兩種,解決或者沒有解決被盈。
在上面提到的文章中給了我們一個很好的示范析孽。我們要利用好蘋果的官方文檔,在官方文檔中我們不僅僅能了解各種API的用法只怎,更重要的是我們還能在文檔中看到蘋果官方在編程中的習慣袜瞬,這個習慣能給我們一個很好的參考。
下面看一下我在1.0 版本中使用的Blocks身堡,以及為什么要在2.0種放棄使用它邓尤。
這是一段文件傳輸?shù)拇a:
[[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]]; }];
方法的實現(xiàn):
- (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未連接"); } }
為了能獲取文件傳輸?shù)倪M度,專門創(chuàng)建了一個Block
@property (nonatomic, copy)void (^WritePartialDataOfLengthBlock)(NSUInteger partialLength);
很明顯,我們在上傳文件的時候需要獲取傳輸?shù)娜齻€狀態(tài):開始傳輸裁赠,傳輸中和傳輸結束殿漠。根據(jù)我們查看蘋果的官方文檔,這個地方最好的方法還是使用Delegates來實現(xiàn)佩捞,所以在2.0中根據(jù)上面總結的幾點做了一些修改绞幌。