Gui*_*ick 5 xcode block objective-c
长期潜伏者,第一次海报。我对Objective-C比较陌生,所以如果我问的东西相当简单,我很抱歉。我的 google & stack overflow-fu 让我失望了,所以我想有人可以帮忙。
我有一个同步进程连续执行三个函数 - 称之为 A -> B-> C ,其中任务 A 执行,然后是 B,然后是 C。
现在,B 涉及一个异步过程,带有一个用于完成的委托回调。但是 B 必须在 C 执行之前完成,所以我需要一些机制,以便在 B 完成之前不会触发 C。我想这个问题一定有一个通用的设计模式吗?
最初天真的解决方案是 -
执行 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
Run Code Online (Sandbox Code Playgroud)
这允许我通过选择器执行块。当块执行时,执行它的线程将等待,直到特定调度信号量发出信号以继续执行。
然后我们可以做的是:
所以我们有
A
B -> Asynchronous with delegate callback
C
Run Code Online (Sandbox Code Playgroud)
下面是一个简单的例子,说明上面是如何实现的
-(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 {
...
}
Run Code Online (Sandbox Code Playgroud)
运行良好,没有任何问题(但我是 Obj C 的新手,所以我的方法可能存在明显的问题)。
您可以将块属性分配给 B,该属性将用于在调用委托方法之前执行代码块。就像是:
@property(非原子,复制)void(^yourBlock)(id blockParameter);
因此,在调用 B 的委托之后,您可以调用此块并执行它。在这个块内,你可以调用C的方法。
| 归档时间: |
|
| 查看次数: |
2996 次 |
| 最近记录: |