2015-05-09 12 views

Odpowiedz

5

można użyć następujących czynności, aby utworzyć płytkie kopię obiektu, tak długo jak nie ma klucz podstawowy:

realm.create(ObjectType.self, withValue: existingObject) 
+0

W moim przypadku istnieje klucz podstawowy, w takim przypadku zagram wniosek o funkcję na github. – mvo

+0

Idea: czy istnieje sposób na odłączenie obiektu (i jego relacji) od sfery, a następnie zastąpienie kluczy podstawowych w obiekcie (i jego relacjami), a następnie dodanie go ponownie? – mvo

+0

Obecnie nie ma sposobu na zrobienie tego wbudowanego w dziedzinę, ale można wykonać kopię rekurencyjną ręcznie. Pamiętaj, aby połączyć ze mną zgłoszony problem! – segiddins

0

Ponieważ problem ten jest wciąż żywa zamieścić moje rozwiązanie, które działa, ale nadal wymaga poprawy. Utworzono rozszerzenie klasy Object, która ma tę metodę duplikowania, która pobiera obiekt objOut i wypełnia płaskie właściwości, patrząc na siebie. Gdy zostanie znaleziona niepusta właściwość (aka zagnieżdżony obiekt), która jest pomijana.

// Duplicate object with its flat properties 
func duplicate(objOut: Object) -> Object { 

    // Mirror object type 
    let objectType: Mirror = Mirror(reflecting: self); 

    // Iterate on object properties 
    for child in objectType.children { 

     // Get label 
     let label = child.label! 

     // Handler for flat properties, skip complex objects 
     switch String(describing: type(of: child.value)) { 
     case "Double", "Int", "Int64", "String": 
      objOut.setValue(self.value(forKey: label)!, forKey: label) 
      break 
     default: 
      break 
     } 
    } 

    return objOut 
} 

Wewnątrz klasy Manager dla moich Realms mam metodę copyFromRealm() którego używam do tworzenia moich kopii obiektów. Aby dać praktyczny przykład tego jest struktura mojej klasie Powołanie:

Appointment object 
    - flat properties 
    - one UpdateInfo object 
     - flat properties 
    - one AddressLocation object 
     - flat properties 
     - one Address object 
      - flat properties 
     - one Coordinates object 
      - flat properies 
    - a list of ExtraInfo 
     - each ExtraInfo object 
      - flat properties 

To jak mam wdrożony() metoda copyFromRealm:

// Creates copy out of realm 
func copyFromRealm() -> Appointment { 

    // Duplicate base object properties 
    let cpAppointment = self.duplicate(objOut: Appointment()) as! Appointment 

    // Duplicate UIU object 
    cpAppointment.uiu = self.uiu?.duplicate(objOut: UpdateInfo()) as? UpdateInfo 

    // Duplicate AddressLocation object 
    let cpAddress = self.addressLocation?.address?.duplicate(objOut: Address()) as? Address 
    let cpCoordinates = self.addressLocation?.coordinates?.duplicate(objOut: Coordinates()) as? Coordinates 
    cpAppointment.addressLocation = self.addressLocation?.duplicate(objOut: AddressLocation()) as? AddressLocation 
    cpAppointment.addressLocation?.address = cpAddress 
    cpAppointment.addressLocation?.coordinates = cpCoordinates 

    // Duplicate each ExtraInfo 
    for other in self.others { 
     cpAppointment.others.append(other.duplicate(objOut: ExtraInfo()) as! ExtraInfo) 
    } 

    return cpAppointment 
} 

nie byłem w stanie znaleźć dobry i rozsądny sposób pracy z obiektami zagnieżdżonymi w mojej metodzie duplicate(). Pomyślałem o rekursji, ale zbyt skomplikowana kod.

To nie jest optymalne, ale działa, jeśli znajdę sposób na zarządzanie również zagnieżdżonym obiektem, zaktualizuję tę odpowiedź.

2

Miałem podobny problem i znalazłem proste rozwiązanie, aby uzyskać kopię obiektu dziedziny. W zasadzie wystarczy, aby przedmiot zgodny z protokołem NSCopying, coś jak:

import RealmSwift 
import Realm 
import ObjectMapper 

class Original: Object, NSCopying{ 
    dynamic var originalId = 0 
    dynamic var firstName = "" 
    dynamic var lastName = "" 

override static func primaryKey() -> String? { 
    return "originalId" 
} 

init(originalId: Int, firstName: String, lastName: String){ 
    super.init() 

    self.originalId = originalId 
    self.firstName = firstName 
    self.lastName = lastName 
} 

func copy(with zone: NSZone? = nil) -> Any { 
    let copy = Original(originalId: originalId, firstName: firstName, lastName: lastName) 

    return copy 
} 
} 

wtedy właśnie nazywamy „kopii()” metoda na obiekcie:

class ViewController: UIViewController { 
    var original = Original() 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var myCopy = original.copy() 
    } 
} 

Zaletą posiadanie kopii polega na tym, że mogę ją zmodyfikować bez konieczności rejestrowania transakcji w sferze. Przydatne, gdy użytkownicy edytują niektóre dane, ale nie poczynili jeszcze oszczędności lub po prostu zmienili zdanie.

3

W moim przypadku chciałem tylko stworzyć obiekt i go nie utrzymywać. więc rozwiązanie segiddins nie działa dla mnie.

Swift 3

Aby utworzyć klon obiektu użytkownika w swift wystarczy użyć

let newUser = User(value: oldUser);

Nowy obiekt użytkownika nie jest zachowywany.

Powiązane problemy