Objective c 将FIFO调度异步队列转换为并发队列

Objective c 将FIFO调度异步队列转换为并发队列,objective-c,macos,asynchronous,osx-mavericks,dispatch-async,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 NSProgressIndi

此代码在工作时,按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];

        });

    }

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

来自:

在iOS 5及更高版本中,您可以自己创建并发调度队列 通过将DISPATCH_QUEUE_CONCURRENT指定为队列类型。在里面 此外,还有四个预定义的全局并发队列用于 要使用的应用程序。有关如何获取全球 并发队列,请参阅“”

您“可以”,但如果仍然使用UIKit方法,则需要分派到主线程


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

如果这是一个OS X而不是iOS应用程序,您的答案会改变吗?对不起,我没有注意到OSX标签。无论如何,始终从:在OS X v10.7及更高版本或iOS 4.3及更高版本中,您还可以创建额外的并发队列以用于您自己的代码模块。这在原始代码中已经是错误的-您不能从任何后台线程调用诸如setTitle:之类的UI方法,包括顺序队列。我交换了
dispatch\u get\u global\u队列(DISPATCH\u QUEUE\u PRIORITY\u DEFAULT,0)
对于
DISPATCH\u QUEUE\u create(“us.yellosoft”,0)
。可根据需要工作。