1

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

        });

    }

}

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

4

2 回答 2

1

文档

在 iOS 5 及更高版本中,您可以通过将 DISPATCH_QUEUE_CONCURRENT 指定为队列类型来自己创建并发调度队列。此外,还有四个预定义的全局并发队列供您的应用程序使用。有关如何获取全局并发队列的更多信息,请参阅“<a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref /doc/uid/TP40008091-CH102-SW5" rel="nofollow">获取全局并发调度队列。”</p>

于 2014-04-11T13:17:57.660 回答
1

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

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

于 2014-04-11T13:19:01.923 回答