0

这就是我正在做的事情。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myurl"]]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        if(!data) {
            // data not recieved or bad data. Initiate reachability test
            // I have built a wrapper for Reachability class called ReachabilityController
            // ReachabilityController also notifies the user for avaibility, UI 

            ReachabilityController *reachability = [[ReachabilityController alloc] init];
            [reachability checkReachability];
            return;
        }
        //update table
    });
});

我的问题是在主队列中进行可达性测试,这通常会冻结 UI。我想在后台模式下运行。

我想在后台模式或低优先级模式下处理 ReachabilityTest。但同样,我的可达性控制器确实通知用户当前的网络可用性,所以在某些时候我将不得不再次使用主队列。

我坚信一定有更好的方法。

4

1 回答 1

1

然而,这是一个正确的方法。它看起来并不完全漂亮,但这并不意味着它不正确。如果您希望您的代码看起来“更干净”,您可能想看一下NSThread并按照自己的方式完成它,但这是一种更容易的方法。

为了使它在我的项目中看起来更容易,我们制作了一个名为 dispatcher 的简单类,它使用块:

+ (void)dispatchOnBackgroundAsync:(void(^)(void))block {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), block);
}

+ (void)dispatchOnMainAsync:(void(^)(void))block {
    dispatch_async(dispatch_get_main_queue(), block);
}

像这样使用:

[Dispatcher dispatchOnBackgroundAsync:^{
    // background thread code

    [Dispatcher dispatchOnMainAsync:^{
        // main thread code
    }];
}];
于 2013-01-15T12:10:42.623 回答