當我想從Facebook獲取用戶ID時,我需要等待API「startWithCompletionHandler」發送給我userID,然後繼續我的任務。就像下面列出的代碼一樣。阻止並等待異步操作Objective-C
但我不能使用dispatch_semaphore或dispatch_group等待api回調。除了completionHandler之外,像MagicalRecord中的「blockAndWait」這樣的其他解決方案可以幫助我解決這樣的問題嗎?
此外,下面列出的解決方案不起作用。它似乎阻止了主線程,所以它會繼續記錄「WAITING」並且不能彈出Facebook登錄視圖。
-(void)getAccountIDAndWait{
__block BOOL isFinish = NO;
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *aUser, NSError *error) {
if (error) {
NSLog(@"bug in getAccountIDAndWait");
return;
}
self.accountID = [aUser objectForKey:@"id"];
isFinish = YES;
}];
while(isFinish==NO){
sleep(0.1);
NSLog(@"WAITING");
}
}
如果你在一個塊內訪問self,這會導致一個保留週期嗎? –
但我想要的是等待completionHandler完成,然後doTheNextThing。任何方式我可以做到這一點? – allenlinli
@ VenkatS.Rao訪問塊內的自我並不一定意味着你有一個保留週期。只有這種情況下,該塊也由自己保留(直接或間接)。 – NSAdam