2012-02-24 1 views
2

현재 이미지를 생성하고 NSMutableArray에 저장하는 응용 프로그램을 작성 중입니다. 그러면 NSMutableArray가 UINavigation (Cell.imageView.image)에서 사용됩니다. 내 응용 프로그램에서 지연을 일으키는 일없이 최대 2000 개의 이미지를 처리 ​​할 수 ​​있어야합니다.백그라운드에서 이미지 생성

현재이 생성을 설정하는 방법은 cellForRowAtIndexPath에 액세스 할 때 생성 방법을 호출하는 것입니다. 다음 네비게이션이 호출되기 전에 4-5 초의 지연이 발생할 것으로 보인다.

다행히도 4-5 초가 지나면 생성이 완료되고 아무런 문제가 없습니다.

세계에서 4-5 초 대기하는 iProducts는 실제로 옵션이 아닙니다. 내 옵션이 백그라운드에서 이러한 이미지를 생성하기위한 것인지 궁금합니다. 나는 스레드를 사용하여 시도했다 [self performSelectorInBackground:@selector(presetSnapshots) withObject:nil]; 그러나 그것은 단지 어떤 이유로 든 벡터에 관한 문제를 내게주었습니다.

을 Heres를 생성하는 코드 : - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 내부

-(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; 

} 

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

    } 

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

편집 :

나는 또한 오히려 이것에 대한 coreData을 사용하지 마십시오. 이미지는 23x23이고 약 7kb로 나옵니다. 따라서 약 6MB의 메모리가 주어진 시간에 사용됩니다.

답변

1

당신은 내가보기에 읽을 수 있습니다 [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]; 
    }); 
}); 
+0

을 해고 그랜드 센트럴 디스패치 (GCD)를 사용할 수 있습니다. 하지만 당신의 코드를 시도하고 stl_constuct.h에 BAD_ACCESS를 가져 왔습니다. 특히 107 줄 {__pointer-> ~ _Tp(); } 스택을 살펴보면, 나의 정리 방법에 관한 문제입니다. 나는 왜 GCD와 나의 정리가 상충되는지를 알아낼 것이다. –

+1

나는 추측한다. 나는 아무런 문제없이 백그라운드 처리를 위해 대부분의 경우이 스 니펫을 사용하고있다. – dom