0

我有一个简单的应用程序,它将其数据存储在 plist 文件中,我需要使用这些数据。所以存储数据的过程大约需要5秒(学习建议的人为延迟),同时我需要读取plist的数据(例如在第二个屏幕中显示)。

所以首先我把保存方法移到

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});

和中的读取方法

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});

但我认为在保存过程中尝试读取 plist 时可能会导致问题。

无论如何,我不需要冻结屏幕。如何在多个线程中正确地为 plist 进行 I/O 进程?可能我应该使用两个不同的队列进行读/写吗?如何同步它们?

4

2 回答 2

3

提示:通过读写器访问提高性能

• 使用并发子系统队列

  • DISPATCH_QUEUE_CONCURRENT

• 使用同步并发“读取”</p>

  • 调度同步()

• 使用异步序列化“写入”</p>

  • dispatch_barrier_async()

例子:

// ...
   _someManagerQueue = dispatch_queue_create("SomeManager", DISPATCH_QUEUE_CONCURRENT);
// ...

您可以在 init 上创建队列,为 nib 唤醒等...如果可以在同一实例中多次调用该函数,请使用 dispatch_once。

然后:

 - (id) getSomeArrayItem:(NSUInteger) index {
    id importantObj = NULL;
    dispatch_sync(_someManagerQueue,^{
        id importantObj = [_importantArray objectAtIndex:index];
     });
   return importantObj;
 }
- (void) removeSomeArrayItem:(id) object {
     dispatch_barrier_async(_someManagerQueue,^{
         [_importantArray removeObject:object];
     });
 }
- (void) addSomeArrayItem:(id) object {
     dispatch_barrier_async(_someManagerQueue,^{
         [_importantArray addObject:object];
     });
 }

这样,您就可以确保每当您读取信息(例如数组)时,所有“更改”都已完成或正在“等待”。而且每次你​​写一个信息,你的程序也不会被阻塞等待操作完成。

您可以使用串行队列,但是这会浪费大量的处理时间,而且时间不会使读数并行化。这样,如果您使用多个线程,则除非它是“写入”,否则没有人必须等待另一个线程,这是正确的。

更多信息:WWDC 2012 会议 712

于 2013-09-02T14:14:32.593 回答
1

您应该使用单个串行队列进行读取和写入。这样,您就可以确保它们不会相互干扰。

例如,viewDidLoad您可以创建队列:

self.queue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

然后你可以在保存时使用它:

dispatch_async(self.queue, ^{
    // save
});

阅读时:

dispatch_async(self.queue, ^{
    // read
});

这是串行队列的主要目的之一,同步对某些共享资源的访问(请参阅串行队列的讨论)。

于 2013-09-02T13:10:27.617 回答