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

标签 iphone objective-c ios cocoa-touch objective-c-blocks

我有以下方法:

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

相关文章:

iphone - 我怎样才能让它在 android/iphone 上播放视频?

objective-c - [NSFont systemFontOfSize] 内存需要释放吗

ios - 使用推送 View Controller 时如何将 Uiimage 从一个 View Controller 传递到其他 View Controller ?

ios - tvOS:无法滚动浏览 UICollectionView 项目,当它像这样实现时:UITableView 内的 UICollectionView

ios - 如何在自定义键盘中实现 Firebase Google Analytics?

iphone - 加速 UIPageViewController

iphone - 如何将 iTunes 音乐文件转换为低带宽 PCM 以供上传

ios - 如何创建可以在没有Apple Store的情况下安装的IOS应用程序?

ios - 如何获得时间(下午 1 - 2 点)或(下午 2 - 3 点)

ios - 根据其值删除NSArray元素