【发布时间】:2013-04-15 20:28:45
【问题描述】:
我正在尝试使用CFRunLoopRunInMode() 来避免在[AFHTTPClient getPath:...] 完成块中返回。
我的代码如下:
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 请求操作完成时调用,第二个块在请求失败时调用。 - 请注意,尝试等待直到某些异步操作完成通常是一个坏主意,特别是如果它阻塞了主线程并因此阻塞了用户界面。
-
我喜欢生活在边缘;)说真的,我真的很想知道它为什么会这样。
标签: ios objective-c objective-c-blocks afnetworking cfrunloop