如果不在主队列上,则无法使用CFHostStartInfoResolution解析DNS地址

时间:2014-08-29 08:00:48

标签: ios core-foundation

我有一个使用SimplePing示例源代码的项目。它在很多时候都可以正常工作,但我遇到了异步名称解析永远不会执行回调的情况。

启动DNS查找的代码(直接来自SimplePing.m)如下所示:

    CFHostClientContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};
    CFStreamError       streamError;

    assert(self->_host == NULL);

    self->_host = CFHostCreateWithName(NULL, (__bridge CFStringRef) self.hostName);
    assert(self->_host != NULL);

    CFHostSetClient(self->_host, HostResolveCallback, &context);

    CFHostScheduleWithRunLoop(self->_host, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

    NSLog(@">CFHostStartInfoResolution");
    success = CFHostStartInfoResolution(self->_host, kCFHostAddresses, &streamError);
    NSLog(@"<CFHostStartInfoResolution");

这通常很好。但是我遇到了一个问题,在某些情况下这个名字永远不会解决。经过大量挖掘后,似乎只要代码没有在主队列上运行,就永远不会调用回调。这是预料之中的吗?在同样的情况下(即不在主队列上),我也注意到我设置的计时器从未触发过。

由于文档没有提到这个限制,并且实际上有一个函数CFHostScheduleWithRunLoop()允许我指定运行循环,我发现很难相信我被限制使用主队列。

我觉得我可能会遗漏一些基本的东西。如果有人能帮我理解发生的事情,我会很感激。

0 个答案:

没有答案