在iOS中处理数据密集型流程的最佳方法是什么?

时间:2014-06-11 16:51:04

标签: ios multithreading

我的iOS应用程序当前同时生成一定数量的随机数 - 由用户定义。我担心的是,当用户请求大量随机数时,应用程序将冻结甚至崩溃。什么是最好的解决方案?我应该在多个线程之间划分任务吗?我不确定解决这个问题的最佳方法。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这样做的一种方法是使用GCD分解工作并使用调度组将其分派到并发队列。然后,当所有并发工作单元完成后,您可以使用dispatch_group_notify()对工作执行某些操作。这将使您的应用在执行工作时保持响应。完成子工作单元后,将结果分派回主队列(即UI队列)进行聚合。

您也应该阅读:https://mikeash.com/pyblog/friday-qa-2009-09-25-gcd-practicum.html

以下是我快速编写的示例代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    const NSUInteger count = 100;  // Total number of random numbers to generate.
    const NSUInteger workUnitCount = 4;  // Take note: this conveniently divides count evenly.
    const NSUInteger countPerWorkUnit = count / workUnitCount;

    dispatch_group_t numberGroup = dispatch_group_create();
    dispatch_queue_t numberQueue = dispatch_queue_create("numberQueue", DISPATCH_QUEUE_CONCURRENT);

    NSMutableArray *__block results = [NSMutableArray arrayWithCapacity:count];

    for (int i = 0; i < workUnitCount; ++i) {
        dispatch_group_async(numberGroup, numberQueue, ^{
            NSMutableArray *workUnitResults = [NSMutableArray arrayWithCapacity:workUnitCount];
            for (int i = 0; i < countPerWorkUnit; ++i) {
                [workUnitResults addObject:@(arc4random() % 5000)];  // Arbitrary upper limit.
            }

            // The results array should only be accessed from the main queue.
            dispatch_async(dispatch_get_main_queue(), ^{
                [results addObjectsFromArray:workUnitResults];
            });
        });
    }

    dispatch_group_notify(numberGroup, dispatch_get_main_queue(), ^{
        [results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSLog(@"random result #%@: %@", @(idx), results[idx]);
        }];
    });

    return YES;
}