gpt4 book ai didi

ios - 使用完成 block 并返回对象的方法

转载 作者:行者123 更新时间:2023-11-29 12:25:08 25 4
gpt4 key购买 nike

我有一个初始化对象的方法,它有一个完成 block :typedef void(^initCompletionHandler)(BOOL successful);

在这个方法中,我想调用处理程序,但我不确定该怎么做,因为如果我在返回之前调用它,对象将不会完成初始化,它会在下一行中立即使用。我也显然不能在返回后调用处理程序。我,即:

   if(haveError){
handler(NO);
}
else{

handler(YES);
}
return self;

有什么方法可以同时返回并调用处理程序吗?

最佳答案

一些观察:

  1. 我不清楚您为什么说“因为...返回对象不会完成初始化。”您正在进行初始化,因此只需确保它在调用该 handler 之前完成所有关联的初始化。如果问题是调用者还没有对该对象的有效引用,您总是可以在 block 的参数中包含对它的引用,例如

    typedef void(^initCompletionHandler)(MyObject object, BOOL succesful);

    然后提供该参数,例如:

    if (haveError){
    handler(self, NO);
    } else {
    handler(self, YES);
    }
  2. 此外,您说“我显然无法在返回后调用处理程序”。但是你可以。如果你愿意,你可以只做一个dispatch_async:

    dispatch_async(dispatch_get_main_queue(), ^{
    if (haveError){
    handler(NO);
    } else {
    handler(YES);
    }
    });
    return self;

    这有点不雅,就好像你从另一个线程调用它一样,你有一些潜在的竞争条件,你可能必须协调/同步,但你明白了:你不必调用 处理程序 同步。

在做了这两个观察之后,我必须承认,我不喜欢让 init 实际上启动一些异步进程并拥有自己的完成 block 。我倾向于采取这两个不同的步骤。如果你看一下 Cocoa API,Apple 本身已经在很大程度上偏离了这种模式,通常有一种方法用于实例化,另一种方法用于启动异步过程。

关于ios - 使用完成 block 并返回对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29366953/

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