2013年5月10日 星期五

Blocks part.1

以常見的UIViewAnimationWithBlocks來說明, 例如下面這Function原型
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
重點在後面兩個傳入的參數
(void (^)(void))animations
(void (^)(BOOL finished))completion

Blocks可以看成Function Pointer, 以我的理解來說就是把一整個Function打包傳給另一個Function當做輸入參數

例如第二個傳入的函式格式 (void (^)(BOOL finished))completion 解釋如下:

第一個 void   是說這個函式沒有回傳值
第二個 符號^ 是表示這個函式是個Blocks
第三個 BOOL finished   表示這函式有接受一個BOOL形態的參數
第四個 completion應該是個它內部接受此Blocks的名稱

所以就跟一般函式宣告方式是一樣的

而實際使用
 [UIView animateWithDuration:5.0
      animations:^(void) {
       [self.myView setFrame:CGRectMake(220, 289, 100, 100)];
       self.myView.alpha = 0.0;
      }
      completion:^(BOOL finished) {
       if (finished) {
        NSLog(@"Finished");
       }
      }
  ];

只解釋第二段Blocks
^(BOOL finished) {
 if (finished) {
  NSLog(@"Finished");
 }
}
如同一開始說的, 可以把它視為一個函式, 我們將這整段Blocks傳給 completion:
而當UIViewAnimation跑完時, 會自動的呼叫我寫的這段Blocks
這段Blocks有接受一個BOOL型態的變數 ,它的來源是UIViewAnimation在呼叫此Blocks時會賦予的



沒有留言:

張貼留言