同时执行多个方法的最快方法

jan*_*del 6 iphone asynchronous objective-c ios

我有4个方法,每个方法在方法返回之前需要一两秒钟,这些方法返回UIImage,我需要这些图像才能以最快的方式显示.

-(NSMutableArray*)prepareImages{
  UIImage *imageToModifyUsingUIImageCategory;

  NSMutableArray *imageArray = [[NSMutableArray alloc]initWithObjects:
  [imageToModifyUsingUIImageCategory doSomethingAndReturn1],
  [imageToModifyUsingUIImageCategory doSomethingAndReturn2],
  [imageToModifyUsingUIImageCategory doSomethingAndReturn3],
  [imageToModifyUsingUIImageCategory doSomethingAndReturn4],nil];    
  return imageArray;
}
Run Code Online (Sandbox Code Playgroud)

在上面的方法结束时,我将从该数组中获得4个图像.每个"doSomethingAndReturn"方法需要一prepareImages两秒,意味着我的方法将完成大约5秒的执行.太久了吧?

我的问题是,还有什么方法可以更快地完成所有这些?GCD是我的选择吗?怎么样?

任何帮助将非常感激.谢谢!

Mik*_*ler 16

假设你不介意在后台顺序加载图像(而不是并行加载),那么运行后台队列的简单调度将起到作用prepareImages:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    NSArray *images = [self prepareImages];

    // now send the result back to the main thread so we can do
    // UIKit stuff
    dispatch_async(dispatch_get_main_queue(), ^{
        // set the images on your UIImageViews here...
    });
});
Run Code Online (Sandbox Code Playgroud)

这将在低优先级后台队列中加载图像,然后在完成后调度回主线程.

如果你想保持这个更低的优先级,你可以使用DISPATCH_QUEUE_PRIORITY_BACKGROUND,虽然这只适用于iOS 4.3及更高版本.dispatch_get_global_queue在这种情况下,您应该检查返回值,如果它返回0,您可以回退其他优先级之一.

如果要并行加载每个图像,则应该将doSomethingAndReturn方法转换为NSOperation子类并使用a NSOperationQueue来运行它们.这需要更多的努力来实施.如果一次处理多个大图像,也要注意内存使用情况.

  • 您可以在其自己的dispatch_async中将每个单独的调用包装到doSomethingAndReturn,以便它们全部并行运行.要等待它们全部完成,您可以创建一个调度组.请参阅此处的文档:http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW25 (2认同)