objective-c - 完成 block ?嵌入同步工作流的异步流程

标签 objective-c xcode block

长期潜伏者,第一次海报。我对 Objective-C 比较陌生,所以如果我问的问题相当简单,我深表歉意。我的 google 和 stack overflow-fu 让我失望了,所以我想有人可以提供帮助。

我有一个同步进程,比如说,连续执行三个函数 - 称之为 A -> B-> C ,其中任务 A 执行,然后是 B,然后是 C。

现在,B 涉及一个异步过程,其中包含用于完成的委托(delegate)回调。但是 B 必须在 C 执行之前完成,所以我需要一些机制,以便在 B 完成之前不会触发 C。我想这个问题一定有一个通用的设计模式?

最初天真的解决方案是 -

执行A
执行 B
while (!B finished) {}
执行C

...但这看起来真的很蹩脚。

我怀疑我可以用某种障碍来做到这一点,但对于我的生活我就是想不通。谁能帮忙?

感谢任何帮助!

纪尧姆

最佳答案

感谢所有反馈 - 很抱歉没有尽快回复。我现在以与建议略有不同的方式解决了这个问题:

首先,我将 NSObject 扩展为具有以下方法 -

#import "NSObject+LTExtensions.h"

@implementation NSObject (Testing)

- (void) performSelectorWithBlock: (SEL) selector withSemaphore:(dispatch_semaphore_t)semaphore
{
  [self performSelector:selector]; // This selector should complete the semaphore
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  dispatch_release(semaphore);
}

@end

这允许我通过选择器执行一个 block 。当 block 执行时,执行它的线程将等待,直到收到特定调度信号量发出的继续执行信号。

接下来我们可以做的事情如下:

  • 调用A
  • 创建一个调度信号量并定义一个执行 B 的选择器
  • 调用上面定义的方法执行B,等待selector完成
  • 当 B 完成时(通过委托(delegate)回调),它向调度信号量发出信号以暂停等待
  • 然后我执行 C

所以我们有

A
B -> Asynchronous with delegate callback
C 

下面是一个简单的例子,说明上面的实现方式

-(void) methodA {

  // ... do something

  // Assign your semaphore (this is a dispatch_semaphore_t)
  self.semaphore = dispatch_semaphore_create(0);
  [self performSelectorWithBlock:@selector(methodB) withSemaphore:semaphore];
  [self methodC];
}

-(void) methodB {
  // ... do whatever needs to be done asynchronously
  CFRunLoopRun();
}

-(void) methodBDelegateCallBack {
  // This is called when B completes

  // Signal completion
  dispatch_semaphore_signal(self.semaphore);
  CFRunLoopStop(CFRunLoopGetCurrent());
}

-(void) methodC {
 ...
}

工作得很好,没有任何问题(但我是 Obj C 的新手,所以我的方法可能存在明显的问题)。

关于objective-c - 完成 block ?嵌入同步工作流的异步流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184068/

相关文章:

ruby-on-rails - 将 block 传递给 rails3 中的标签助手

objective-c - Cocoa-Touch – 委托(delegate)混淆

ios - 如何从我的应用中打开缩短的 Google map URL?

ios - UIAppearance 更改 UITableView backgroundView 导致主线程崩溃

ios - 首次出现时无法更改 UITableViewCell 中 UILabel 的框架(使用自动布局)

ios - 第二次运行时,Google map 在 iOS 中显示白屏?

ios - 货币数字的格式

ios - Xcode iOS : How to reset a sound once it has played using AVFoundation

html - 如果鼠标在固定 block 上方,则滚动不起作用

ios - 初始化 block 内的对象