Agregar arrays al reino con swift 3

Soy nuevo en Reino y traté de agregar una matriz como lo hice con cadenas y terminé con algunos errores. Entonces, después de una pequeña búsqueda, descubrí una solución:

class Sensors : Object { dynamic var name = "" dynamic var message = "" var topic: [String] { get { return _backingNickNames.map { $0.stringValue } } set { _backingNickNames.removeAll() _backingNickNames.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) } } let _backingNickNames = List<RealmString>() override static func ignonetworkingProperties() -> [String] { return ["topic"] } } class RealmString: Object { dynamic var stringValue = "" } 

Esto funciona muy bien, ahora quiero agregar otra matriz dentro de esta class. Si alguien conoce otras forms de agregar arrays con reino, por favor compártalo.

Gracias por adelantado

Como regla general, es mucho más eficiente usar las relaciones de uno a varios proporcionadas por el reino en lugar de tratar de emularlas mediante el uso de matrices (las collections del reino son perezosas, los objects contenidos solo se crean instancias cuando es necesario, en contraposition a las matrices Swift simples) .

En su caso, si entiendo correctamente lo que está tratando de hacer, desea agregar [RealmString] Swift arrays a la list _backingNickNames .

¿Por qué no usar el método append(objectsIn:) de la class List de Realm (ver aquí ), así:

 // Dog model class Dog: Object { dynamic var name = "" dynamic var owner: Person? } // Person model class Person: Object { dynamic var name = "" dynamic var birthdate = NSDate(timeIntervalSince1970: 1) let dogs = List<Dog>() } let jim = Person() let dog1 = Dog() let dog2 = Dog() // here is where the magic happens jim.dogs.append(objectsIn: [dog1, dog2]) 

Si quieres hacer lo contrario (convertir de una list a una matriz) simplemente haz lo siguiente:

 let dogsArray = Array(jim.dogs) 

• • • • • • • •

De vuelta a su propia solución publicada , podría refactorizar fácilmente el model para adaptarse a esto. Cada object de Sensor podría tener varios Topic y varios objects de Message adjuntos.

Simplemente topicV properties computadas del message y el topic y cambie el nombre del tema topicV y messageV a topics y messages respectivamente. También cambie el nombre de RealmString a Topic y RealmString1 a Message .

Ahora, podría repetir fácilmente los temas, por ejemplo, conectados a un sensor como este:

 for topic in sensor1.topics { ... } 

O si desea adjuntar un post a un sensor, puede hacer algo como esto (no olvide agregar correctamente el object recién creado al DB primero):

 let message1 = Message() message1.stringValue = "Some text" sensor2.messages.append(message1) 

Entonces, no es necesario utilizar Swift Arrays intermedios.

Después de probar, logré agregar otra matriz como esa:

 class Sensors : Object { dynamic var type = "" dynamic var name = "" dynamic var badge = 0 var topic: [String] { get { return topicV.map { $0.stringValue } } set { topicV.removeAll() topicV.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) } } var message: [String] { get { return messageV.map { $0.stringValue1 } } set { messageV.removeAll() messageV.append(objectsIn: newValue.map({ RealmString1(value: [$0]) })) } } let topicV = List<RealmString>() let messageV = List<RealmString1>() override static func ignonetworkingProperties() -> [String] { return ["topic", "message"] } } class RealmString: Object { dynamic var stringValue = "" } class RealmString1: Object { dynamic var stringValue1 = "" } 

Lo que ha dicho Bogdanf, y la forma en que lo ha implementado son correctos.

Los types de valores básicos a un lado, Realm solo pueden almacenar references a objects del Object Realm singular, así como a las matrices de Object s usando el Tipo de List . Como tal, si desea save una matriz de types, es necesario encapsular cualquier tipo básico que desee save (como una String aquí) en un Object dominio de conveniencia.

Como dijo bogdanf, no se recomienda convertir lists de Reino Unido a matrices Swift estándar y viceversa, ya que pierde las ventajas de las características de carga perezosa de Realm (que pueden causar problemas de performance y memory), pero los problemas de memory pueden mitigarse al less al encerrar el código que copy los datos fuera del Reino en un bloque @autoreleasepool .

 class MyObject: Object { dynamic var childObject: MyObject? let objectList = List<MyObject>() } 

Por lo tanto, en la revisión, es una buena práctica trabajar directamente con los objects de List Realm siempre que sea posible, y usar @autoreleasepool cada vez que realmente quiera recorrer todos los objects secundarios en un Reino. 🙂