0

我有最多可以读取 100k 行的 for 循环。
当我启动此功能时,它会阻止我的 UI 直到完成。

for (Item* sp in items){
    data = [data stringByAppendingFormat:@"\"%@\",\"%@\","\n", ....];
}

我怎样才能把它放到单独的线程中,这样它就不会阻塞 UI?

4

4 回答 4

2

我认为您没有提供完整的示例,但是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];

});
于 2013-09-23T11:20:35.373 回答
0

这可能适合你

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 

            });


    });
于 2013-09-23T11:21:03.767 回答
0

如果顺序在您的循环中无关紧要,我更喜欢dispatch_apply()dispatch_async(). 不同之处在于,传统for(...)循环将所有工作放在单个线程上,而dispatch_apply()将在多个线程上并行执行各个迭代,但作为一个整体,循环是同步的,在所有处理完成之前循环不会退出已经完成。

查看循环中顺序是否重要的​​一个很好的测试是循环是否可以以相同的结果向后执行。

于 2013-09-23T12:26:26.520 回答
0

使用 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 

        });
}
于 2013-09-23T11:46:56.603 回答