在后台生成图像

时间:2012-02-24 15:40:27

标签: objective-c ios multithreading pthreads nsthread

我目前正在构建一个生成图像的应用程序,并将它们存储在NSMutableArray中,然后在UINavigation(Cell.imageView.image)中使用。我需要能够处理多达2000个图像,而不会导致我的应用程序滞后。

目前我如何设置此生成是通过在访问cellForRowAtIndexPath时调用生成方法。在调用下一个导航之前,这似乎会造成4-5秒的延迟。

幸运的是,在4-5秒后,生成完成并且没有问题。

在iProducts的世界中等待4-5秒并不是一个真正的选择。我想知道我在后台生成这些图像的选项是什么。我尝试使用线程[self performSelectorInBackground:@selector(presetSnapshots) withObject:nil]; 但由于某种原因,这只给了我关于载体的问题。

继承生成代码:

-(void)presetSnapshots{
    //NSAutoreleasePool* autoReleasePool = [[NSAutoreleasePool alloc] init];
    for (int i = 0; i < [selectedPresets count]; ++i){
        GraphInfo* graphInfo = [selectedPresets objectAtIndex:i];
        graphInfo.snapshot = [avc takePictureOfGraphInfo:graphInfo PreserveCurrentGraph:false];
        [graphInfo.snapshot retain];
    }
    //[autoReleasePool drain];
    presetSnapshotFinished = YES;

}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {内的

   if (presetSnapshotFinished == NO){
        [self presetSnapshots];
        //[self performSelectorInBackground:@selector(presetSnapshots) withObject:nil];

    }

    cell.imageView.image = [[selectedPresets objectAtIndex:indexPath.row] snapshot];

修改

我也不愿意为此使用coreData。图像是23x23,大约7kb。所以它的大约6MB用于内存中的任何给定时间。

1 个答案:

答案 0 :(得分:1)

您可以使用Grand Central Dispatch(GCD)启动[self presetSnapshots]

dispatch_queue_t working_queue = dispatch_queue_create("com.yourcompany.image_processing", NULL);
dispatch_queue_t high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,NULL);
dispatch_set_target_queue(working_queue,high);
dispatch_queue_t main_queue = dispatch_get_main_queue();

dispatch_async(working_queue,^{
    if (presetSnapshotFinished == NO){
       [self presetSnapshots];
    }
    dispatch_async(main_queue,^{
        cell.imageView.image = [[selectedPresets objectAtIndex:indexPath.row] snapshot];
    });
});