1

我已经设置了一个块以在不同的队列上运行并在延迟后调用另一个方法:

piemanQ = dispatch_queue_create(PIEMAN_QUEUE_NAME, NULL);
dispatch_async(piemanQ, ^{
    [self performSelector:@selector(sendReadyToPieman) withObject:nil afterDelay:1.0];
});

我预计一秒钟后@selector(sendReadyToPieman)会发生火灾,但是什么也没发生。我已经通读了 doco performSelector:withObject:afterDelay:,它谈到了通过当前队列上的计时器添加的方法。我检查了当前队列运行循环模式,但它返回 nil。

我确定我以前做过这种代码,但是我在两个不同的地方尝试过,在这两种情况下它都没有运行。但是,如果我将其替换为dispatch_after(...)一切正常。

任何人都可以解释一下吗?

4

2 回答 2

2

我的猜测是:dispatch_async 执行它所说的,它使以下内容异步运行。你排队你的选择器,然后块完成,整个异步事情就消失了。当然,包括排队选择器。

为了让 performSelector 做任何事情,线程需要处于活动状态,并且需要执行 runloop。

于 2012-09-10T13:33:16.687 回答
2

您应该将操作放在 NSOperationQueue 上:

NSOperationQueue *piemanQ = [[NSOperationQueue alloc] init];
piemanQ.name = @"some name";
[piemanQ addOperationWithBlock:^{
    [self performSelector:@selector(sendReadyToPieman) withObject:nil afterDelay:1.0];
}];

这是自动异步的。最好使用 Objective-C 解决方案而不是 C 解决方案来解决问题。

于 2012-09-10T13:33:22.283 回答