Iphone - >将图像从包复制到文档文件夹需要很长时间

时间:2012-08-12 18:24:22

标签: iphone multithreading image copy

当我的应用程序第一次启动时,我需要将一些(大约300-400张图像)复制到文档文件夹中。我所看到的是它需要很长的工具(甚至认为我现在只测试30-40张图像)。在开始时我的应用程序在手机上运行时崩溃(而不是在模拟器上)因为运行时间太长。现在我正在运行复制线程上所有文件的方法。该应用程序保持不变,但我认为ios几秒后就会杀死该线程。我应该在新线程上复制每个图像吗?

我的代码是这样的:(这是在线程中运行的部分)

-(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 个答案:

答案 0 :(得分: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];
        }
    });
}

关于更快地复制,我不知道任何解决方案。