block的做用

ios高效開發--blocks相關

 
一、替換delegate
 
    若是咱們有2個viewController,a和b,當咱們從a界面push到b後,在b上面觸發了一些事件,這些時間又會影響到a界面上的內容。
               
上面是2個界面,當咱們點擊b界面的按鈕3的時候,但願a界面上文字也相應的改變了
   
 
通常狀況下咱們會用delegate來實現。
代理很強大,不過代理它是程序的事件邏輯也變的複雜了。
 
來看下用block怎麼處理。
 一個block語句的定義相似於C的函數,有返回值,有0到多個參數,接下來屬性聲明,跟通常的屬性聲明差很少: 
1 typedef void (^CallBack)(int index);
2 
3 @property(nonatomic, copy)CallBack callBack;
 
而後在b裏面觸發按鈕事件的時候調用block,調用前最好先檢查下是否爲nil
  
複製代碼
 1 - (IBAction)click2:(id)sender
 2 {
 3     if(self.callBack)
 4         self.callBack(2);
 5 }
 6 
 7 
 8 - (IBAction)click3:(id)sender
 9 {
10     if(self.callBack)
11         self.callBack(3);
12 }

 

複製代碼
如今完成了調用,具體的實如今哪呢,咱們回到a當中,在a中執行跳轉界面的地方,加上相關的實現。
 
複製代碼
1     SecondViewController *secondController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
2     
3     secondController.callBack = ^(int index)
4     {
5         self.clickBtnLabel.text = [NSString stringWithFormat:@"click %d", index];
6     };
7     
8     [self.navigationController pushViewController:secondController animated:YES];
複製代碼
在是用block的時候,要注意全部權的問題,要當心產生循環,那樣會致使資源沒法釋放。
例如在block中使用了一個指針,恰巧這個指針又是block的擁有者,那麼會產生一個循環引用,他們都是強引用,沒法釋放。爲了不產生相似的問題,就須要用__weak標記block的擁有者。delegate和block在上面時候是用,要看具體狀況,若是一個類的delegate裏有不少方法,那仍是放在delegate裏實現吧。
 
二、系統定義的block
ios當中還有大量系統已經定義好的block,使用這些block實現特定的一些功能,能是總體代碼更加簡潔和高效。
例如遍歷字典的時候,ios就提供了:
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block;

簡單舉個例子,咱們要在字典中根據key來查找某個value,而後把value記錄下來。html

 

複製代碼
 1     NSArray *keyArray = @[@"aa", @"ddd", @"cc", @"bb", @"ww", @"111"];
 2     NSArray *valueArray = @[@"apple", @"ios", @"mac", @"xcode", @"view", @"array"];
 3     NSDictionary *enumDict = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
 4     __block NSString *valueString = nil;
 5     [enumDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
 6         if([key isEqualToString:@"bb"])
 7         {
 8             valueString = obj;
 9             *stop = YES;
10         }
11     }];
複製代碼

整個過程變的簡單了。ios

還有在實現UIView動畫的時候,block能讓咱們更加簡單高效的實現不少特效。xcode

1     [UIView animateWithDuration:0.5 animations:^{
2         animateView.alpha = 0.0;
3     } completion:^(BOOL finished) {
4         animateView.alpha = 1.0;
5     }];

這段代碼實現了view透明度從1.0變到徹底透明,用時0.5秒,當動畫結束後從新顯示view。app

相關文章
相關標籤/搜索