2017-02-10 17 views
2

Я работаю с Realm, я бы получил/задал свойство объекта realm из разных операций, которые добавляются к одному NSOperationQueue.Как заставить NSOperationQueue работать в одном потоке?

Скажем, в operation0, я установил свойство объекта realm в новое значение, затем добавлю операцию1 в ту же операционную очередь, операция1 выберет свойство объекта realm, которое может получить старое значение, поскольку операция запуска потока1 может отличаться из работа0.

Как я могу это решить? Любое предложение будет оценено.

ответ

1

Похоже, что вам необходимо сделать гарантию, что operation1 начнет выполнение только после того, как operation0 успешно завершил настройку транзакции Realm write.

Есть 2 способа вы могли бы потенциально справиться с этим:

1. Сделайте серийные очереди операции. Задайте свойство maxConcurrentOperationCount очереди на 1, так что, даже если вы одновременно добавите операции в очередь, они будут исполняться только в том порядке, в котором они были добавлены.

2. Сделать operation1 в зависимости от operation0. Если вам нужно поддерживать параллельную операцию, вы можете использовать NSOperation.addDependency(_:), чтобы явно убедиться, что operation1 начнется только после того, как operation0 завершен.

В operation1, убедитесь, что вы звоните refresh() на Realm объекта, который вы используете, чтобы принести свой объект Realm для того, чтобы быть абсолютно уверенным, что изменения, внесенные в operation0 были правильно выставлены на этой очереди.

+0

'refresh' похоже не работает, если в потоке нет runloop. – KudoCC

+0

'autorefresh' не работает в потоках, потому что он опирается на механизм runloop. 'refresh', чтобы явно принудительно обновить в этих случаях. – TiM

+0

Ничего себе, это работает. Спасибо за вашу помощь. BTW Я думаю об использовании NSThread для выполнения этой работы, потому что NSOperationQueue, кажется, использует много потоков, даже если я устанавливаю 'maxConcurrentOperationCount' равным 1, если каждый поток имеет моментальный снимок, он должен потреблять много памяти и время процессора. – KudoCC