2017-01-26 5 views
0

В каждом из моих контроллеров отображения, где я использую Realm, я добавляю сферу как свойство для каждого класса:Глобального использования Realm Instance в Swift

//Whatevs.swift 
class Whatevs:NSViewController{ 
    let realm = try! Realm() 
} 

Я затем ссылаться на него по всему классу с помощью self.realm.

Есть ли причина не делать это глобально доступным экземпляром вроде этого?

//Global.swift <-- General swift file in my app 
let realm = try! Realm() //<-- Not inside a class 

ответ

3

На самом деле, это, как правило, не рекомендуется развешивать на Realm случаях вообще, если она может быть оказана помощь. :)

Как только Realm() вызывается в определенном потоке, этот экземпляр будет внутренне кэширован Realm, и тот же экземпляр будет возвращен при последующих вызовах Realm(). В результате нет ощутимого выигрыша в производительности от зависания на экземпляре Realm как члена класса, подобного этому.

Если вы выполняете какие-либо операции с резьбой в своем приложении, вам нужно быть осторожным с хранением ссылок Realm, так как вызов self.realm в фоновом потоке инициирует исключение.

Если вы имеете дело только с областью по умолчанию, то лучше всего просто позвонить let realm = try! Realm() в то время, когда вы действительно в ней нуждаетесь.

Если вы имеете дело с различными типами областей, которые полагаются на конкретные экземпляры Configuration, тогда рекомендуется хранить их как глобальные константы. Realm Configuration объекты потокобезопасны, поэтому их можно передать в фоновый поток, чтобы создать Realm экземпляров там без проблем.

+0

Это действительно интересно, спасибо. Так лучше ли не использовать 'Realm()' как свойство класса? Я делаю это только из удобства. Должен ли я сбрасывать или освобождать экземпляры «Realm()», когда я их использую (например, в 'deinit' в классе Swift)? –

+1

Мое удовольствие! Да, лучше не хранить его как свойство класса; просто позвоните 'let realm = try! Realm() 'всякий раз, когда вам это нужно. Отбрасывание освобождения от него не приведет к немедленному действию, но вы можете помещать вызовы 'Realm()' внутри блоков '@ autoreleaspool', чтобы заставить систему освободить их, когда вы закончите. – TiM

Смежные вопросы