实现一个采用块作为回调的方法

我想写一个类似的方法:

+(void)myMethodWithView:(UIView *)exampleView completion:(void (^)(BOOL finished))completion;

我基本上已经把苹果的一个 UIView类方法的语法剥离出来了:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

并且希望它被这样使用:

[myFoo myMethodWithView:self.view completion:^(BOOL finished){
NSLog(@"call back success");
}];

我的问题是如何实现这一点?如果有人能给我指出正确的文档,那就太好了,一个非常基本的示例将会非常受欢迎(或者在 Stack Overflow 上有一个类似的答案——我找不到)。我对代表团的了解还不够多,无法确定这种做法是否正确!

我已经在实现文件中提供了一个粗略的例子,说明我希望它是什么样的,但是由于我找不到信息,所以只能靠猜测。

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
// do stuff


if (completion) {
// what sort of syntax goes here? If I've constructed this correctly!
}


}
43149 次浏览

你可以像调用常规函数一样调用一个块:

BOOL finished = ...;
if (completion) {
completion(finished);
}

这意味着使用你的例子来实现一个完整的块函数应该是这样的:

+ (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion {
if (completion) {
completion(finished);
}
}

我强烈建议你阅读 积木来理解正在发生的事情。

如果你正在特别寻找一个文档,创建自定义方法使用块,然后下面的链接是一个解释它的几乎一切。:)

Http://developer.apple.com/library/ios/documentation/cocoa/conceptual/blocks/articles/bxusing.html

我最近碰巧回答了一个相同的问题,看看这个: 不使用 typedef 声明块方法参数