长期潜伏,第一次海报。我对objective-c比较陌生,所以如果我问的问题相当简单,我会道歉。我的谷歌和堆栈溢出Fu让我在这里,所以我觉得有人可能会帮助。
我有一个同步的进程,比如说,三个函数在一行中称之为-> B-> C,其中任务A执行,接着是B,后面是C。
现在,B包含一个异步过程,其中有一个委托回调以完成。但是B必须在C执行之前完成,所以我需要一些机制,以便在B完成之前不会触发C。我想这个问题一定有一个通用的设计模式吧?
最初天真的解决方案是-
执行
执行B
同时(!b完成){}
执行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

这允许我通过选择器执行块。当块执行时,执行它的线程将等待,直到通过特定的分派信号量发出继续执行的信号。
我们可以这样做:
打电话给
创建一个调度信号量并定义一个选择器来执行
调用上面定义的方法来执行b并等待选择器完成
当b完成时(通过委托回调),它向调度信号量发出信号,以暂停等待
然后我执行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,所以可能有明显的问题与我的方法)。

08-05 22:54