我有一個稱爲getCount:
的異步方法,它轉到網址,計算一些東西,並在計數完成時調用回調。Obj-C同步使用塊回調的異步方法
我有另一種同步的方法,需要將這些結果放入消息中,並返回該消息。下面是兩個在一起:
- (NSString *)describe {
__block bool gotCount = NO;
[self getCount:^(int count) {
NSLog(@"Got the count: %i", count);
_count = count; // _count is an ivar of the object with this method.
gotCount = YES;
}];
// Pause here until the count has been fetched.
while (!gotCount) {
[NSThread sleepForTimeInterval:0.05];
}
return [NSString stringWithFormat:@"The count is %i", _count];
}
當我嘗試這是我的回調不會被調用。它從不打印
Got the count 0
或此方案中計數的任何其他值。
如果我註釋掉while循環,那條消息就會被打印出來。所以我知道getCount:
方法的工作原理,我的循環等待它到達時出現問題。
我需要getCount:
保持異步(還有其他地方,它被用在哪裏更重要),我需要describe
保持同步。我該如何處理?
_Why_您需要'describe'等待返回嗎? – 2014-10-08 19:12:34
直到我們看到'getCount:'的來源並知道'describe'正在運行什麼隊列時,我們才能真正知道發生了什麼。我的猜測是,getCount:正在調度回調以與描述相同的串行隊列運行。 – 2014-10-08 19:15:18
這種積極等待的形式非常糟糕......如果睡眠和回調在同一隊列中,它也不起作用 – 2014-10-08 19:18:10