0

當我想從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"); 
} 

}

回答

0

您正在使用有的方法是阻塞。正如你正確觀察,這不是你想要的。這裏的設計意圖是讓您在完成處理程序中的請求完成後,將想要發生的事情放入其中。

1

擴展Chuck說我稍微修改了代碼以允許getAccountIdAndWait函數完成(因此主線程空閒),並且在調用completionHandler時它將調用doTheNextThing函數。

-(void)getAccountIDAndWait{ 
    [[FBRequest requestForMe] startWithCompletionHandler: 
    ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *aUser, NSError *error) { 
     if (error) { 
      NSLog(@"bug in getAccountIDAndWait"); 
      return; 
     } 

     self.accountID = [aUser objectForKey:@"id"]; 
     [self doTheNextThing]; 
    }]; 

} 
+0

如果你在一個塊內訪問self,這會導致一個保留週期嗎? –

+0

但我想要的是等待completionHandler完成,然後doTheNextThing。任何方式我可以做到這一點? – allenlinli

+1

@ VenkatS.Rao訪問塊內的自我並不一定意味着你有一個保留週期。只有這種情況下,該塊也由自己保留(直接或間接)。 – NSAdam