ios - AFHTTPClient 成功和失败 block 中的 CFRunLoopRunInMode()

标签 ios objective-c objective-c-blocks afnetworking cfrunloop

我正在尝试使用 CFRunLoopRunInMode() 来避免在 [AFHTTPClient getPath:...] 完成 block 中返回。

我的代码如下:

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,但调度队列从不执行提交的 block 。如果我在完成 block 之外运行相同的代码,则输出符合预期。

我不明白为什么从完成 block 运行时调度队列没有被处理。

有人可以解释一下为什么会发生这种情况吗?

最佳答案

I cannot figure out why the dispatch queue is not processed when run from completion blocks.

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

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

相关文章:

ios - 使用 Facebook 登录时出错

ios - 使用 tableViewController 时 iphone x home 指示器问题

ios - 使用 NSTimer 触发上一个 Controller 上的方法

iphone - 关于 "SIGSEGV"崩溃有任何线索吗?

objective-c - 将异步调用包装到同步阻塞线程中?

ios - 方法在完成处理程序之前返回

ios - block 中的 objective-c block

ios - iOS 版 UE4 AR(Kit) 开发中出现图标错误

ios - 切换捕获模式时是否可以将自定义转换添加到 UIImagePicker 自定义叠加层?

Objective-C block ,递归失败