2013-08-20 6 views
2

ОК, так что в основном вот что я хочу сделать:Копирование файлов без замораживания GUI

  • У меня есть список файлов в моем приложение пачке, например, в папке myData (обратите внимание: есть много файлов/папок в пределах подпапок/и т.д.)
  • Я хочу скопировать все дерево файла в заданном месте на диске пользователя
  • мне нужно иметь доступ к каждому отдельный файл копируется, так как некоторые из них должны быть обработаны перед копированием.

Как бы вы это сделали? Есть идеи?


P.S.

  • Я знаю о NSFileWrapper «s writeFile:atomically:updateFilenames, но это не ГНС мне доступ к каждому файлу
  • у меня уже есть метод для получения дерева файлов для определенной папки. Тем не менее, мне все же кажется медленным. Есть ли какой-либо встроенный (или более удобный для Cocoa) способ для этого?
  • Поскольку существует довольно много файлов, весь процесс должен работать так, что графический интерфейс делает не сублимационной
+0

подробное объяснение здесь: http://stackoverflow.com/questions/7290931/gcd-threads-program-flow-and-ui-updating/7291056#7291056 – bryanmac

ответ

6

использование Grand Central Dispatch (GCD), чтобы запустить метод в асинхронном нить с помощью

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // user disk space - will use user document 
    NSString *docuemntPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    // app bundle folder 
    NSString *bundleRoot = [[NSBundle mainBundle] resourcePath]; 
    NSString *folderPath = [bundleRoot stringByAppendingPathComponent:@"aFolder"]; 

    NSArray *files = [[NSFileManager defaultManager] enumeratorAtPath:folderPath].allObjects; 

    for (NSString *aFile in [files objectEnumerator]) { 
     NSString *copyPath = [folderPath stringByAppendingPathComponent:aFile]; 
     NSString *destPath = [docuemntPath stringByAppendingPathComponent:aFile]; 

     NSError *error; 
     if ([[NSFileManager defaultManager] copyItemAtPath:copyPath toPath:destPath error:&error]) { 
      NSLog(@"Copying successful"); 
      // here add a percent to progress view 
     } else { 
      NSLog(@"Copying error: %@", error.userInfo); 
     } 
    } 

    // When the copying is finished update your UI 
    // on the main thread and do what ever you need with the object 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [self someMethod:myData]; 
    }); 
}); 

и в вашем основном потоке используйте UIProgressView, чтобы указать ход работы файла с количеством файлов/папок.

Смежные вопросы