关于ios GCD global_queue

发布于 2022-08-28 11:54:26 字数 154 浏览 9 评论 0

我有个函数是将数组存储到本地文件中去。
准备dispatch_async到global_queue中执行。

如果该函数在极短的时间内执行多次,会不会出现多个任务同时操作该本地文件的情况,这样子做是否安全?
如果不安全的话,用什么方法更好?
求大神指教

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉城已无爱 2022-09-04 11:54:26

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");

        });
    });
}
羁绊已千年 2022-09-04 11:54:26

存储到本地文件的目的是?

如果是为了保存对象,可以考虑使用缓存:

https://github.com/tumblr/TMCache

或者简单一些,存到NSUserDefault 中

歌入人心 2022-09-04 11:54:26

不安全的,global queue是并行queue,所以肯定会发生多个任务同时操作一个文件的情况。所以你应该建立一个自己的queue,自己的queue都是串行的,所以能保证当前只有一个文件操作。你用dispatch_async派遣到那个queue去,既不会卡住UI,也不会造成线程不安全。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文