【问题标题】:Is NSFileManager thread safe?NSFileManager 线程安全吗?
【发布时间】:2013-03-12 09:58:52
【问题描述】:
是否可以通过defaultManager获取NSFileManager的实例并在主队列外使用?
这段代码可以吗?
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q, ^{
NSFileManager *fm = [NSFileManager defaultManager];
});
【问题讨论】:
标签:
objective-c
cocoa-touch
concurrency
grand-central-dispatch
nsfilemanager
【解决方案1】:
来自NSFileManager Class Reference:
共享的 NSFileManager 对象的方法可以从
多个线程安全。但是,如果您使用委托来接收
有关移动、复制、删除和链接状态的通知
操作,您应该创建文件管理器的唯一实例
对象,将您的委托分配给该对象,并使用该文件管理器
开始您的操作。
【解决方案2】:
来自documentation:
共享的 NSFileManager 对象的方法可以安全地从多个线程中调用。但是,如果您使用委托来接收有关移动、复制、删除和链接操作状态的通知,您应该创建文件管理器对象的唯一实例,将您的委托分配给该对象,并使用该文件管理器来启动你的操作。
【解决方案3】:
直接来自NSFileManager documentation:
线程注意事项
共享 NSFileManager 的方法
可以安全地从多个线程调用对象。但是,如果您使用
接收有关移动、复制状态的通知的委托,
删除和链接操作,您应该创建一个唯一的实例
文件管理器对象,将您的委托分配给该对象,然后使用
那个文件管理器来启动你的操作。