NSFileManager线程安全

时间:2014-05-18 23:51:23

标签: ios multithreading nsfilemanager

根据Apple的文档,NSFileManager在执行基本文件操作时是线程安全的:

“可以安全地从多个线程调用共享NSFileManager对象的方法。但是,如果使用委托接收有关移动,复制,删除和链接操作状态的通知,则应创建一个唯一的实例文件管理器对象,将您的委托分配给该对象,并使用该文件管理器启动您的操作。“

我怎样才能在后台线程上执行所有文件操作,同时仍然确保所有文件操作的执行顺序与主线程调用的顺序相同?

1 个答案:

答案 0 :(得分:-1)

您可以使用以下代码确保文件操作按您想要的顺序完成。我还编写了一个示例函数,可以从任何线程调用来执行文件操作。

    //this will create a queue 
    dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);

    //call methods on different threads, to be performed one after the other.
    dispatch_sync(_serialQueue, ^{ printf("1"); //call 1st method here 
     });
    printf("2");
    dispatch_sync(_serialQueue, ^{ printf("3"); //call second method here 
    });
    printf("4");

执行顺序为1234

以下是您可以调用的线程安全NSFileManager方法的示例。

-(void)threadSafeMethod{ //you can call this method from any thread and do file operations

NSFileManager *fileManager = [[NSFileManager alloc] init];

if ([fileManager fileExistsAtPath:sourceFile]) {

  NSError *error = nil;
  if (![fileManager copyItemAtPath:sourceFile
                            toPath:destFile
                             error:&error]) {
    // Deal with error
  }
}

}

如果您查看NSFileManager的类文档,概述部分包含此警告:

  

可以从中调用共享FileManager对象的方法   安全多线程。但是,如果您使用委托来接收   有关移动,复制,删除和链接状态的通知   在操作中,您应该创建文件管理器的唯一实例   对象,将您的委托分配给该对象,并使用该文件管理器   开始你的行动。

无论如何,区别仅在于你如何启动NSFileManager,一个是defaultManager,另一个是分配NSFileManager的瞬间。

希望这有帮助。