【发布时间】:2013-04-25 19:14:52
【问题描述】:
我刚刚发现了完成块:
completion:^(BOOL finished){
}];
我需要做什么才能让我自己的方法执行完成块?
【问题讨论】:
标签: objective-c objective-c-blocks
我刚刚发现了完成块:
completion:^(BOOL finished){
}];
我需要做什么才能让我自己的方法执行完成块?
【问题讨论】:
标签: objective-c objective-c-blocks
1) 定义自己的完成块,
typedef void(^myCompletion)(BOOL);
2) 创建一个将完成块作为参数的方法,
-(void) myMethod:(myCompletion) compblock{
//do stuff
compblock(YES);
}
3)这就是你使用它的方式,
[self myMethod:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
【讨论】:
completion:(void (^)(BOOL success, NSString* videoPath))
您将块定义为自定义类型:
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 是块的本地副本的名称)。
【讨论】:
块变量在语法上类似于 C 中的函数指针。
由于语法难看,它们通常是类型定义的,但是它们也可以正常声明。
typedef void (^MyFunc)(BOOL finished);
- (void)myMethod:(MyFunc)func
{
}
查看非 typedef 的答案:
【讨论】:
@interface之前。