2013-05-01 64 views

回答

215

1)定義你自己完成的塊,

typedef void(^myCompletion)(BOOL); 

2)創建這需要你完成的方法塊作爲參數,

-(void) myMethod:(myCompletion) compblock{ 
    //do stuff 
    compblock(YES); 
} 

3)這是你如何使用它,

[self myMethod:^(BOOL finished) { 
    if(finished){ 
     NSLog(@"success"); 
    } 
}]; 

enter image description here

+0

compclock(YES)與return compclock = YES相同? – user2206906 2013-05-01 18:52:39

+0

是的,你已經知道了,我們可以根據需要放置計時器(YES)/計時器(NO),我們可以在這裏返回NO來表示失敗完成 – 2013-05-01 18:55:03

+0

跟蹤返回值:if(finished)NSLog(@「success」);否則NSLog(@「failure」); – 2013-05-01 18:58:41

2

塊變量在語法類似於C.

由於語法是難看它們通常通過typedef到函數指針,然而,它們也可以正常聲明。

typedef void (^MyFunc)(BOOL finished); 

- (void)myMethod:(MyFunc)func 
{ 
} 

看到這個答案非的typedef:

Declare a block method parameter without using a typedef

+0

好的,謝謝我會檢查出來,這對我來說有點複雜,我在哪裏有typedef? – user2206906 2013-05-01 18:38:41

+1

你可以在'@ interface'之前的typedef放在頭文件中。 – 2015-06-07 22:07:52

24

您定義塊爲自定義類型:

typedef void (^ButtonCompletionBlock)(int buttonIndex); 

然後使用它作爲一個一種方法的論點:

+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title 
          cancelAction:(ButtonCompletionBlock)cancelBlock 
         completionAction:(ButtonCompletionBlock)completionBlock 

當在代碼中調用這個它只是像任何其他塊:

[SomeButtonView buttonViewWithTitle:@"Title" 
         cancelAction:^(int buttonIndex) { 
          NSLog(@"User cancelled"); 
        } 
        completionAction:^(int buttonIndex) { 
          NSLog(@"User tapped index %i", buttonIndex); 
        }]; 

如果談到時間,觸發塊,只需調用completionBlock()(其中completionBlock是當地塊的副本的名稱)。

+1

爲你而設的勳章,善良的先生。 – Josh 2017-01-17 16:47:58

相關問題