根据Apple的文档,NSFileManager在执行基本文件操作时是线程安全的:
“可以安全地从多个线程调用共享NSFileManager对象的方法。但是,如果使用委托接收有关移动,复制,删除和链接操作状态的通知,则应创建一个唯一的实例文件管理器对象,将您的委托分配给该对象,并使用该文件管理器启动您的操作。“
我怎样才能在后台线程上执行所有文件操作,同时仍然确保所有文件操作的执行顺序与主线程调用的顺序相同?
答案 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的瞬间。
希望这有帮助。