gpt4 book ai didi

iphone - 等待值改变然后执行 block

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

我有以下方法:

-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;

这是该方法应该执行的操作:

  1. 检查某些状态是否具有正确的值
  2. 如果它确实调用了 block successBlock
  3. 如果不等待status更改为给定值,然后调用 block successBlock

我考虑使用 KVO 来检查值是否已更改,但随后我必须将 block 存储在某个实例变量中,或者更糟糕的是,存储在数组中,并且我会丢失当前方法调用的上下文。所以我真正想要的是这样的:

-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock{
if(self.status == kDesiredStatus){
successBlock;
} else {

[TheMagicDispatchWaitUntil:(self.status == kDesiredStatus) andThenDoThis:^{
successBlock;
}];
}
}

有没有一种方法可以在不使用 KVO 或其他辅助方法的情况下实现此目的?

最佳答案

如果你想让 theead 等待一个事件 - 消息、计时器或其他什么,一个非常好的方法是使用 Concurrent NSOperation。这些对象在单独的线程上运行,但具有 runLoop,因此它们可以在 runloop 回调中以“正常”方式阻塞,等待某些事情发生。

也就是说,这些确实需要一些技巧才能发挥作用。我有一个demo project在 gthub 上,您可以探索并发 NSOperations(还有其他操作)。

另一种阻塞直到某件事完成(在线程上)的好方法是使用“dispatch_wait()”,它等待属于一个组的所有已排队的 block 。这种技术非常容易掌握 - 您创建一个调度组并使用标准队列或创建您自己的队列,然后使用dispatch_group函数对 block 进行队列。一旦所有内容都排队,您就可以使用dispatch_wait(forever)来等待 block 完成。

关于iphone - 等待值改变然后执行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11913761/

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