长期潜伏,第一次海报。我对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,所以可能有明显的问题与我的方法)。