潜伏已久,第一次发海报。我对 Objective-C 比较陌生,所以如果我问的问题相当简单,我很抱歉。我的谷歌和堆栈溢出让我失望了,所以我想有人可以提供帮助。
我有一个同步进程,比如说,连续执行三个函数 - 称之为 A -> B-> C ,其中执行任务 A,然后执行 B,然后执行 C。
现在,B 涉及一个异步进程,并带有用于完成的委托回调。但是B必须在C执行之前完成,所以我需要一些机制,使得C在B完成之前不会被触发。我想这个问题一定有一个通用的设计模式吗?
最初天真的解决方案是 -
执行A
执行B
while (!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
这允许我通过选择器执行块。当块执行时,执行该块的线程将等待,直到收到特定调度信号量的信号以继续执行。
那么我们可以做的事情如下:
- Call A
- 创建一个调度信号量并定义一个执行 B 的选择器
- 调用上面定义的方法执行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 的新手,所以我的方法可能存在明显的问题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)