如何强制一个线程上运行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()
。
如果线程中没有runloop,'refresh'似乎不起作用。 – KudoCC
'autorefresh'在线程中不起作用,因为它依赖于runloop机制。 'refresh'在那里显式强制刷新。 – TiM
哇,它的工作原理。谢谢你的帮助。顺便说一句我在考虑使用NSThread来完成这项工作,因为NSOperationQueue似乎使用了很多线程,即使我将maxConcurrentOperationCount设置为1,如果每个线程都有一个快照,它必须消耗大量内存和Cpu时间。 – KudoCC