代码之家  ›  专栏  ›  技术社区  ›  Niv

XPC服务中未调用ASIHTTPRequestDelegate方法

  •  0
  • Niv  · 技术社区  · 10 年前

    我在XPC服务中使用优秀的ASIHTTPRequest从互联网获取一些数据。

    我正在创建一个简单的请求。但是,由于某些原因,它的委托函数没有被调用。 我已启用ASIHTTPRequest的调试日志,因此我看到请求确实执行了。 经过一番挖掘,我发现了可能的原因:

    在ASIHTTPRequest.m中,在requestFinished方法的末尾,有一个调用:

    [self performSelectorOnMainThread:@selector(reportFinished) withObject:nil waitUntilDone:[NSThread isMainThread]];
    

    reportFinished方法是调用委托的方法。 出于某种原因,它从未被发射。如果我将此行替换为:

    //[self performSelectorOnMainThread:@selector(reportFinished) withObject:nil waitUntilDone:[NSThread isMainThread]];
    [self reportFinished];
    

    则调用委托。然而,我假设它是在运行异步请求时在错误的线程上调用的。

    我应该做什么来调整代码,以便它调用委托的方法,而不修改它的逻辑/线程?

    1 回复  |  直到 10 年前
        1
  •  0
  •   sergio    10 年前

    我建议将声明转换为:

    [self performSelectorOnMainThread:@selector(reportFinished) withObject:nil waitUntilDone:[NSThread isMainThread]];
    

    这在语义上应该是等价的:

    if ([NSThread isMainThread]) {
        [self reportFinished];
    } else {
        dispatch_sync(dispatch_get_main_queue(),
                       ^{
                           [self reportFinished];
                       });
    }
    

    或者简单地说,这也应该起作用:

    dispatch_sync(dispatch_get_main_queue(),
                       ^{
                           [self reportFinished];
                       });