将完成处理程序保存为对象

use*_*558 11 objective-c ios

我想知道是否有办法"拯救"完成汉德勒.

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{

}

- (void)actionHere {
    completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)

我想将结果发送到不同的函数,如上所示.

Gab*_*lla 30

TL;博士

声明一个复制属性(奇怪的语法,我知道...... http://fuckingblocksyntax.com/)

@property (nonatomic, copy) void (^completionHandler)(UIBackgroundFetchResult fetchResult);
Run Code Online (Sandbox Code Playgroud)

并使用如下

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    self.completionHandler = completionHandler;
}

- (void)actionHere {
    if (self.completionHandler)
        self.completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)

讨论

块是Objective-C中的完整对象,它们有很大的不同:默认情况下它们是在堆栈上分配的.

如果要保存对块的引用,则必须将其复制到堆上,因为在堆栈帧被拆除时,在堆栈上保留块不会阻止它丢失.

要在堆上复制块,您必须调用该Block_Copy()函数.您可以选择调用该copy方法(它将为您调用上一个函数).

声明具有该copy属性的属性将使编译器copy在通过属性设置器分配对象时自动插入调用.