如何强制一个线程上运行NSOperationQueue?

问题描述:

我正在使用Realm,我将从不同的操作中获取/设置领域对象的属性,这些操作被添加到一个NSOperationQueue如何强制一个线程上运行NSOperationQueue?

假设在操作0中,我将领域对象的属性设置为一个新值,然后将操作1添加到相同的操作队列,操作1获取领域对象的属性,可能会得到旧值,因为线程运行操作1可能不同从操作0。

我该如何解决这个问题?任何建议将不胜感激。

听起来好像您需要保证operation1只有在operation0已成功完成设置Realm写入事务后才开始执行。

有2种方式,你可能会处理这个问题:

1.进行操作队列序列。将队列的maxConcurrentOperationCount属性设置为1,这样即使您将操作同时添加到队列中,也只会按照添加它们的顺序执行。

2.使operation1依赖于operation0如果您需要保持操作队列并发,则可以使用NSOperation.addDependency(_:)明确确保operation1仅在operation0完成后才会开始。

operation1,请确保您您正在使用,以绝对确保你在operation0所做的更改已适当暴露在该队列获取你的域对象Realm对象调用refresh()

+0

如果线程中没有runloop,'refresh'似乎不起作用。 – KudoCC

+0

'autorefresh'在线程中不起作用,因为它依赖于runloop机制。 'refresh'在那里显式强制刷新。 – TiM

+0

哇,它的工作原理。谢谢你的帮助。顺便说一句我在考虑使用NSThread来完成这项工作,因为NSOperationQueue似乎使用了很多线程,即使我将maxConcurrentOperationCount设置为1,如果每个线程都有一个快照,它必须消耗大量内存和Cpu时间。 – KudoCC