yan*_*nce 5 xcode cocoa multithreading
似乎这些是让NSThread进入睡眠状态的唯一方法
* sleepForTimeInterval:
* sleepUntilDate:
Run Code Online (Sandbox Code Playgroud)
我要问的是不好的做法吗?
Jon*_*ess 17
你想让你的线程停止,直到某个其他线程告诉它再次启动?如果是这样,您可以使用NSConditionLock.NSConditionLock类似于条件变量.它有几个基本方法,lockWhenCondition和unlockWithCondition,以及lock.一个典型的用法是让你的后台线程在条件锁上等待"lockWhenCondition:",并在前台线程中设置条件,这会导致后台线程被唤醒.条件是一个简单的整数,通常是枚举.
这是一个例子:
enum {
kWorkTodo = 1,
kNoWorkTodo = 0
}
- (id)init {
if ((self = [super init])) {
theConditionLock = [[NSCoditionLock alloc] initWithCondition: kNoWorkTodo];
workItems = [[NSMutableArray alloc] init];
}
}
- (void)startDoingWork {
[NSThread detachNewThreadSelector:@selector(doBackgroundWork) toTarget:self withObject:nil];
}
- (void)doBackgroundWork:(id)arg {
while (YES) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *items = nil;
[theConditionLock lockWhenCondition:kWorkTodo]; // Wait until there is work to do
items = [NSArray arrayWithArray:workItems]
[workItems removeAllObjects];
[theConditionLock unlockWithCondition:kNoWorkTodo];
for(id item in items) {
// Do some work on item.
}
[pool drain];
}
}
- (void)notifyBackgroundThreadAboutNewWork {
[theConditionLock lock];
[workItems addObject:/* some unit of work */];
[theConditionLock unlockWithCondition:kWorkTodo];
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,当调用startDoingWork时,doBackgroundWork:将在后台线程上启动,但随后停止,因为没有任何工作要做.一旦调用了notifyBackgroundThreadAboutNewWork,那么doBackgroundWork:将启动并处理新工作,然后返回休眠状态等待新工作可用,这将在下次调用notifyBackgroundThreadAboutNewWork时发生.
| 归档时间: |
|
| 查看次数: |
4528 次 |
| 最近记录: |