有没有办法无限期地暂停NSTHread并让它从另一个线程恢复?

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时发生.

  • 在锁定锁定时,他正在做的工作并不完全正确.`workItems`数组是一个收件箱; `notifyBackgroundThreadAboutNewWork`方法在那里留下新项,`lockWithCondition:`和`unlockWithCondition:`消息之间的代码将项提取到一个新数组(`items`).所有的实际工作都发生在`unlockWithCondition:`之后,并使用那个临时的`items`数组. (3认同)
  • 他正在使用条件锁作为同步点,允许一个线程向另一个线程发出信号,表明它可以继续进行任何操作.`lockWhenCondition`调用有效地使后台线程"无限期地"(就像你所说的那样)睡眠,直到前台线程指定了条件.至于NSLock和NSConditionLock之间的区别,如果你阅读文档就很明显了.使用NSLock,每个人都锁定同样的事情.条件锁定可以指定N个不同的条件,这允许更精细的锁定. (2认同)