扫码关注官方订阅号
我有个函数是将数组存储到本地文件中去。 准备dispatch_async到global_queue中执行。
如果该函数在极短的时间内执行多次,会不会出现多个任务同时操作该本地文件的情况,这样子做是否安全? 如果不安全的话,用什么方法更好? 求大神指教
人生最曼妙的风景,竟是内心的淡定与从容!
global queue是异步队列。LZ的操作可能会造成某一时刻进行同时操作文件,导致数据异常。 换句话说对于你的操作不是线程安全的。解决方法有两个 1.使用NSUserDefault来做。 但是NSUserDefault有位数限制。 2.自己可以创建一个串行队列然后把然后自己的操作丢到队列里面。
#define SYNCGCDQUEUE "COM.CONEBOY.APP.GCD.SYNCGCDQUEUE" @interface KKBaseGCDQueue : NSObject /** * 获取一个自定义的全局 同步 队列 * * @return 返回全局 同步 队列 */ + (dispatch_queue_t)shareSyncGCDQueue; @end @implementation KKBaseGCDQueue + (dispatch_queue_t)shareSyncGCDQueue { static dispatch_queue_t baseSyncQueue = nil; static dispatch_once_t createSyncBaseQueue; dispatch_once(&createSyncBaseQueue, ^{ baseSyncQueue = dispatch_queue_create(SYNCGCDQUEUE, NULL); }); return baseSyncQueue; } @end // 使用 - (void)writeFiles{ dispatch_sync([KKBaseGCDQueue shareSyncGCDQueue],^{ NSLog(@"blk0"); dispatch_async(dispatch_get_main_queue(), ^{ // update UI NSLog(@"main_queue---blk0"); }); }); }
存储到本地文件的目的是?
如果是为了保存对象,可以考虑使用缓存:
https://github.com/tumblr/TMCache
或者简单一些,存到NSUserDefault 中
不安全的,global queue是并行queue,所以肯定会发生多个任务同时操作一个文件的情况。所以你应该建立一个自己的queue,自己的queue都是串行的,所以能保证当前只有一个文件操作。你用dispatch_async派遣到那个queue去,既不会卡住UI,也不会造成线程不安全。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
global queue是异步队列。LZ的操作可能会造成某一时刻进行同时操作文件,导致数据异常。
换句话说对于你的操作不是线程安全的。解决方法有两个
1.使用NSUserDefault来做。 但是NSUserDefault有位数限制。
2.自己可以创建一个串行队列然后把然后自己的操作丢到队列里面。
存储到本地文件的目的是?
如果是为了保存对象,可以考虑使用缓存:
https://github.com/tumblr/TMCache
或者简单一些,存到NSUserDefault 中
不安全的,global queue是并行queue,所以肯定会发生多个任务同时操作一个文件的情况。所以你应该建立一个自己的queue,自己的queue都是串行的,所以能保证当前只有一个文件操作。你用dispatch_async派遣到那个queue去,既不会卡住UI,也不会造成线程不安全。