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

标签 ios objective-c

我想知道是否有一种方法可以“保存”完成处理程序。

-(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/

相关文章:

ios - Firebase 桥接 header 不起作用

ios - 如何从 2 个不同的 View Controller 观察 NSManagedObject 记录的变化?

ios - 将 MainViewController 设置为 MKMapView 的委托(delegate)时不会出现注释

iphone - 如何从MKMapView中的kml文件获取地标图标?

iphone - 在 iOS 中读取 PPT、xls 和 .doc 文件的 SDK

ios - NSNetServiceBrowser找不到服务

iOS 检测用户何时停止触摸 UIImageView

ios - -[NSConcreteNotification 计数] : unrecognized selector sent to instance 0x2816dd380

ios - AFNetworking 客户端子类不解析响应

ios - 防止 iOS App Extension 中的屏幕变暗