将FIFO dispatch_async队列转换为并发

时间:2014-04-11 13:07:30

标签: objective-c macos asynchronous osx-mavericks dispatch-async

此代码在工作时按FIFO顺序执行两个任务:

-(void) update {

    @autoreleasepool {

        dispatch_queue_t queue = dispatch_queue_create("us.yellosoft", 0);

        // inpternal address
        dispatch_async(queue,^(){

            // TODO: implement NSProgressIndicator logic

            [internalIpMenuItem setTitle: @"Updating..."];

            // get IP address from [[NSHost currentHost] addresses]...
            NSString *localIP = [self getLocalIP];

            // change UI
            [internalIpMenuItem setTitle: localIP];

        });

        // external address
        dispatch_async(queue, ^(){

            // TODO: implement NSProgressIndicator logic

            [externalIpMenuItem setTitle: @"Updating..."];

            // get IP address from external JSON service...
            NSString *externalIP = [AddressService getIPaddress];

            // change UI
            [externalIpMenuItem setTitle: localIP];

        });

    }

}

我想同时运行两个任务。这可能吗?

2 个答案:

答案 0 :(得分:1)

来自docs

  

在iOS 5及更高版本中,您可以自己创建并发调度队列   通过将DISPATCH_QUEUE_CONCURRENT指定为队列类型。在   此外,还有四个预定义的全局并发队列   申请使用。有关如何获得全球化的更多信息   并发队列,请参阅“Getting the Global Concurrent Dispatch Queues。”

答案 1 :(得分:1)

你“可以”,但如果你使用UIKit方法,你需要调度到主线程。

为了并行化工作,您应该使用全局并发队列。使用您自己的并发调度队列,只有在您想要同步对共享资源的访问时才有意义 - 在这种情况下,您需要使用dispatch_barrier_asyncdispatch_barrier_sync