gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 10:41:52 28 4
gpt4 key购买 nike

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com