2013-05-01 1 views

Odpowiedz

215

1) określić swój własny blok zakończenia,

typedef void(^myCompletion)(BOOL); 

2) Utwórz metodę, która ma swoje zakończenie blok jako parametr,

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

3) Jest to, jak go używać,

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

enter image description here

+0

compclock (YES) to to samo co return compclock = YES? – user2206906

+0

Tak, masz to, możemy umieścić compclock (TAK)/compclock (NO) w zależności od wymagań, możemy zwrócić NIE dla zakończenia awarii tutaj –

+0

śledzić zwróconą wartość: if (zakończone) NSLog (@ "sukces"); else NSLog (@ "niepowodzenie"); –

2

blokami zmiennych są podobne składni funkcjonować wskaźniki w C.

Ponieważ składni brzydki są często typedefed jednak mogą one również zostać uznane normalnie.

typedef void (^MyFunc)(BOOL finished); 

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

Zobacz tę odpowiedź za brak typedef:

Declare a block method parameter without using a typedef

+0

ok, dzięki, sprawdzę to, to jest trochę skomplikowane, skąd mam typedef? – user2206906

+1

Możesz umieścić typedef w pliku nagłówkowym, przed '@ interfejsem'. –

24

zdefiniować blok jako typ niestandardowy:

typedef void (^ButtonCompletionBlock)(int buttonIndex); 

następnie użyć go jako argument do metody:

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

Dzwoniąc to w kodzie to jest tak jak w każdym innym bloku:

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

Jeśli chodzi o czas, aby wywołać blok, wystarczy zadzwonić completionBlock() (gdzie completionBlock to nazwa lokalnej kopii bloku).

+1

Medal dla ciebie, miły panie. – Josh