GCD模式共享资源访问+ UI更新?(GCD pattern for shared resource

2019-08-01 00:49发布

乡亲! 我执行我的应用程序共享缓存。 我们的想法是在后台网站获取缓存的数据,然后更新缓存,并与新检索数据的UI。 诀窍当然是保证线程安全的,因为主线程将使用高速缓存是连续的。 我不想修改缓存以任何方式,而其他人可能会使用它。

这是我的理解是使用@synchronized锁定访问共享资源不在的ObjectiveC最优雅的方式,由于它捕捉到内核,因而是相当缓慢的。 我一直在阅读,使用GCD反而是一个伟大的选择(让我们忽略其表弟的NSOperation现在),我想弄清楚我的情况的良好格局是什么。 下面是一些示例代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// download the data in a background thread
dispatch_async(queue, ^{
    CacheData *data = [Downloader getLatestData];

    // use the downloaded data in the main thread
    dispatch_sync(dispatch_get_main_queue(), ^{
        [AppCache updateCache:data];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"CacheUpdated" object:nil];
    });
});
  1. 这会真正做什么,我想这样做,如果是的话,这是最干净的方法,因为处理这种情况的今天? 有一个博客张贴这是相当接近我在说什么,但我想和你仔细检查为好。
  2. 我想,只要我只访问共享同一线程/队列中的共享资源(主要在我的情况),只有不断更新主UI,那么我会有效地实现线程安全。 那是对的吗?

谢谢!

Answer 1:

是。 其他考虑因素放在一边,而不是分流读/写工作在主线程可以考虑使用私有调度队列。

dispatch_queue_t readwritequeue;
readwritequeue = dispatch_queue_create("com.myApp.cacheAccessQueue", NULL);

然后更新您的应用程序缓存类:

- (void)updateCache:(id)data {
 dispatch_sync(readwritequeue, ^{ ... code to set data ... });
}

- (id)fetchData:... {
 __block id data = nil;
 dispatch_sync(readwritequeue, ^{ data = ... code to fetch data ...});
 return data;
}

然后更新您原来的代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// download the data in a background thread
dispatch_async(queue, ^{
    CacheData *data = [Downloader getLatestData];
    **[AppCache updateCache:data];**

    // use the downloaded data in the main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"CacheUpdated" object:nil];
    });
});


Answer 2:

如果你问这里100个开发者是最优雅的方式来做到这一点,你会得到至少100个不同的答案(也许更多!)

我做什么,什么是对我工作的很好,就是有一个单独的类做我的形象管理。 我使用的核心数据,并直接在店里保存的缩略图,但使用文件系统和URL给它的核心数据为“大”的文件。 核心数据是设置为使用新的基于块的接口,因此它可以做自身管理的专用线的所有工作。

可能的图片网址获得与主线程标记注册。 其他类可以询问该标记的图像。 如果图像是不存在的,无则返回,但这个类设置一个fetchingFlag,使用连接到NSURLConnection的并发的NSOperation来获取图像,当它到达它的IT信息与接收到的图像数据,其线程单身,和方法获得该消息使用“[MOC performBlock:...]”(没有等待)来处理它。

当图像被最后添加到存储库中,MOC调度在主队列与接收到的图像标签的通知。 是希望像类可以侦听此,当他们得到它(在主线程),他们就可以再次索要图像商务部,这显然是有。



文章来源: GCD pattern for shared resource access + UI update?