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