我試圖用CFRunLoopRunInMode()
來避免返回[AFHTTPClient getPath:...]
完成塊。在AFHTTPClient成功和失敗塊內的CFRunLoopRunInMode()
我的代碼如下所示:
NSLog(@"start");
__block BOOL someCondition = NO;
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://domain.com"]];
[client getPath:@"my/path" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"success");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"async log");
someCondition = YES;
});
while (!someCondition) {
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, YES);
}
NSLog(@"failure");
}];
我預期的輸出是:
start
async log
failure
而是我只得到:
start
CFRunLoopRunInMode()
返回kCFRunLoopRunHandledSource
,但分派隊列從不執行提交的塊。如果我在完成塊之外運行相同的代碼,則輸出如預期。
我想不通爲什麼當從完成塊運行時,調度隊列沒有被處理。
有人可以請說出爲什麼發生這種情況?
這是*完成塊*。第一個塊在HTTP請求操作完成時被調用,第二個塊在請求失敗時被調用。 - 請注意,嘗試*等待直到某個異步操作完成通常是一個壞主意,特別是如果它阻塞主線程和用戶界面。 –
我喜歡住在邊緣;)真的,我真的想知道爲什麼它的行爲如此。 – hectr