我有最多可以读取 100k 行的 for 循环。
当我启动此功能时,它会阻止我的 UI 直到完成。
for (Item* sp in items){
data = [data stringByAppendingFormat:@"\"%@\",\"%@\","\n", ....];
}
我怎样才能把它放到单独的线程中,这样它就不会阻塞 UI?
我有最多可以读取 100k 行的 for 循环。
当我启动此功能时,它会阻止我的 UI 直到完成。
for (Item* sp in items){
data = [data stringByAppendingFormat:@"\"%@\",\"%@\","\n", ....];
}
我怎样才能把它放到单独的线程中,这样它就不会阻塞 UI?
我认为您没有提供完整的示例,但是Grand Central Dispatch的简单使用应该可以解决问题:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (Item* sp in items){
data = [data stringByAppendingFormat:@"\"%@\",\"%@\","\n", ....];
}
// Then if you want to "display" the data (i.e. send it to any UI-element):
dispatch_async(dispatch_get_main_queue(), ^{
self.someControl.data = data;
});
// else simply send the data to a web service:
self.webService.data = data;
[self.webService doYourThing];
});
这可能适合你
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
for(Item* sp in items)
{
data = [data stringByAppendingFormat:@"\"%@\",\"%@\","\n", ....];
}
dispatch_async(dispatch_get_main_queue(), ^{
//UI updates using item data
});
});
如果顺序在您的循环中无关紧要,我更喜欢dispatch_apply()
在dispatch_async()
. 不同之处在于,传统for(...)
循环将所有工作放在单个线程上,而dispatch_apply()
将在多个线程上并行执行各个迭代,但作为一个整体,循环是同步的,在所有处理完成之前循环不会退出已经完成。
查看循环中顺序是否重要的一个很好的测试是循环是否可以以相同的结果向后执行。
使用 NSInvocationOperation 的最佳方式。
NSOperationQueue *OperationQueue=[[NSOperationQueue alloc] init];
NSInvocationOperation *SubOperation=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(LoopOperation) object:nil];
[SubOperation setQueuePriority:NSOperationQueuePriorityVeryHigh]; //You can also set the priority of that thread.
[OperationQueue addOperation:SubOperation];
-(void)LoopOperation
{
for (Item* sp in items)
{
data = [data stringByAppendingFormat:@"\"%@\",\"%@\","\n", ....];
}
dispatch_async(dispatch_get_main_queue(), ^{
//UI updates using item data
});
}