2012-08-12 58 views
0

我的應用程序第一次啓動時需要將一些(300-400圖像)複製到文檔文件夾。我看到的是,它需要很長的工具(甚至現在我認爲只用30-40張圖片進行測試)。開始時我的應用程序在手機上運行時(不在模擬器上)崩潰,因爲運行時間太長。現在我正在運行復制線程中所有文件的方法。該應用程序保持運行,但我認爲ios會在幾秒鐘後終止該線程。我應該每個圖像複製一個新的線程?Iphone - >將圖像從包複製到文檔文件夾需要很長的時間

我的代碼是這樣的:(這是在線程中運行的部分)

-(void) moveInitialImagesFromBundleToDocuments { 
//move all images. 

    NSMutableArray *images = [MyParser getAllImagesList]; 
    for (int i = 0 ; i< [images count] ; i++) { 
     [self copyFileFromBundleToDocuments:[images objectAtIndex:i]]; 
    } 
} 

- (void) copyFileFromBundleToDocuments: (NSString *) fileName { 

    NSString *documentsDirectory = [applicationContext getDocumentsDirectory]; 
    NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName]; 
    NSString *destinationPath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
    NSLog(@"Source Path: %@\n Documents Path: %@ \n Destination Path: %@", sourcePath, documentsDirectory, destinationPath); 

    NSError *error = nil; 

    [self removeFileFromPath:destinationPath]; 


    [[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destinationPath error:&error]; 

    NSLog(@"File %@ copied", fileName); 
    NSLog(@"Error description-%@ \n", [error localizedDescription]); 
    NSLog(@"Error reason-%@", [error localizedFailureReason]); 
} 

有什麼建議?首先要更快速地複製,我應該爲每個複製的文件創建一個新線程?


註釋1:

這看起來不錯。但我想調暗應用程序,以便用戶無法使用該應用程序,直到所有圖像加載完畢。

我在下面運行這個方法。它確實阻止了用戶運行應用程序,但我認爲在電話中,線程正在被殺,因爲當我嘗試它時,加載時間過長。從來沒有停止過。

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
hud.labelText = @"preparing..."; 
hud.dimBackground = YES; 
hud.square = YES; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    // Do something... 

    FileUtil *fileut = [[FileUtil alloc] init]; 
    [fileut moveInitialImagesFromBundleToDocuments]; 

    //Done something 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
    }); 
}); 
+1

就是爲什麼你需要複製的影像?你可以在任何地方訪問它們,如果你在/ Documents中混合了圖像,你總是可以定義一些方法來處理「canned」圖像和其他修改後的圖像,通過複製你在用戶設備上浪費了200M空間另一個想法是鏈接或「從符號鏈接」從文檔文件夾到包 - 更復雜一點(必須使用C api我相信),但會更快(如果它的工作),因爲你會被創建文件系統指針而不是複製文件。 – 2012-08-12 19:51:46

+0

我同意David H.副本是什麼意思?據我所知,從捆綁中提取圖像是完全合法的做法。 – mark 2012-08-12 20:11:12

+0

問題是用戶將不得不從互聯網上更新數據。所以我不能覆蓋包中的文件。所以我需要將它們放在doc文件夾中。 – Panos 2012-08-12 22:58:40

回答

1

當調用該方法時,我建議您使用GCD將其移動到後臺線程,以便您可以像這樣調用整個循環。 (我也改變了一點點你的週期,使之簡單。

-(void) moveInitialImagesFromBundleToDocuments 
{ 
//move all images and use GCD to do it 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    NSMutableArray *images = [MyParser getAllImagesList]; 
     for (id image in images) { 
      [self copyFileFromBundleToDocuments:image]; 
     } 
    }); 
} 

關於使拷貝速度更快,我不知道任何解決方案。

+0

請在我的問題上檢查評論1。 – Panos 2012-08-12 19:07:59

相關問題