我正在尝试使用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,但是分派队列从不执行提交的块。如果我在完成代码块之外运行相同的代码,则输出是预期的。

我无法弄清楚为什么从完成块运行时不处理调度队列。

有人可以解释为什么会这样吗?

最佳答案

我无法弄清楚为什么从完成块运行时不处理调度队列。


因为您没有“运行”调度队列(没有“运行”调度队列之类的东西)。您运行了运行循环。调度队列是相关的,但是是另一回事。一次只能在串行队列(如main)上运行一个块。在您的区块完成之前,无法安排其他区块。 GCD中没有API可以规避这一点。这通常是一件非常好的事情,因为它可以确定运行循环操作中并不总是存在的队列操作。

关于ios - AFHTTPClient成功和失败块中的CFRunLoopRunInMode(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16024169/

10-12 15:11