我想知道是否有一种方法可以“保存”完成处理程序。
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
}
- (void)actionHere {
completionHandler(UIBackgroundFetchResultNewData);
}
我想用不同的函数发送结果,如上所示。
最佳答案
tl;博士
声明一个复制属性(奇怪的语法,我知道... http://fuckingblocksyntax.com/)
@property (nonatomic, copy) void (^completionHandler)(UIBackgroundFetchResult fetchResult);
然后像下面这样使用它
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
self.completionHandler = completionHandler;
}
- (void)actionHere {
if (self.completionHandler)
self.completionHandler(UIBackgroundFetchResultNewData);
}
讨论
block 是 Objective-C 中的完整对象,但是它们有一个很大的不同:默认情况下它们分配在堆栈上。
如果你想保存一个 block 的引用,你必须将它复制到堆上,因为在堆栈上保留一个 block 不会阻止它在堆栈框架被拆除时丢失。
为了在堆上复制一个 block ,您必须调用 Block_Copy()
函数。您可以选择调用 copy
方法(它将为您调用之前的函数)。
使用copy
属性声明属性将使编译器在您通过属性 setter 分配对象时自动插入copy
调用。
关于ios - 将完成处理程序保存为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19171206/