2017-02-16 6 views
2

Ich bin neu in Realm und ich frage mich, ob es sinnvoll ist, Primärschlüssel des Objekts in View-Controller und Objekt als gespeicherte Eigenschaft zu speichern.Realm schnelle Thread sichere Variable

class VC: ViewController{ 
    public var id:Int! 
    private var customer:Customer{ 
     get{ 
      return DBO.loadCustomer(for: id) 
     } 
    } 
} 
class DBO{ 
    public static func loadCustomer(for id: Int) -> Customer{ 
     let realm = try! Realm() 
     return realm.object(ofType: Customer.self, forPrimaryKey: id)! 
    } 
} 

Ich gehe davon aus, dass dies, weil meine app Thread-sicher sein wird, denn jedes Mal, Thread versucht, Kunden zuzugreifen es Aufgabe von db holen wird. Aber ich frage mich, ob dies für einzelne Objekte und Arrays von Objekten effizient ist.

Antwort

1

Ab Realm 2.2 Sie Thread-sichere Referenzen (siehe here) verwenden:

Jetzt können Sie Thread-sichere Referenzen für alle Arten erstellen, die innerhalb eines Realm zuvor faden beschränkt waren, und Objekte zwischen Fäden vorbei zu einem einfachen, dreistufigen Prozess:

  1. mit dem gewinde beschränkte einen ThreadSafeReference Initialisiere Objekt.
  2. Übergeben Sie die ThreadSafeReference an einen Zielthread oder eine Zielwarteschlange.
  3. Lösen Sie diese Referenz im Zielbereich auf, indem Sie Realm.resolve (_ :) aufrufen. Verwenden Sie das zurückgegebene Objekt wie gewohnt.

Und ein Codebeispiel, von der Quelle über:

let realm = try! Realm() 
let person = Person(name: "Jane") // no primary key required 
try! realm.write { 
    realm.add(person) 
} 
let personRef = ThreadSafeReference(to: person) 
DispatchQueue(label: "com.example.myApp.bg").async { 
    let realm = try! Realm() 
    guard let person = realm.resolve(personRef) else { 
    return // person was deleted 
    } 
    try! realm.write { 
    person.name = "Jane Doe" 
    } 
} 

Aber sollte Ihr Ansatz auch gut funktionieren.