У меня есть проект, который использует ObjectMapper для сериализации и десериализации JSON и Realm для локального кэширования данных.Я получаю данные из Rest API и правильно сохраняю их в базе данных областей, которые я проверил с помощью RealmStudio.Проблема заключается в том, что когда я получаю данные из базы данных, свойство типа объекта возвращает ноль!Это мой класс, и foodFact - это тип объекта, который равен нулю при получении данных FoodRecipe из базы данных. Есть идеи?
import RealmSwift
import ObjectMapper
typealias Syncable = Object & Mappable
class FoodFact: Syncable {
@objc dynamic var objectId :String = ""
@objc dynamic var calcium: String = ""
@objc dynamic var iron: String = ""
@objc dynamic var fiber: String = ""
@objc dynamic var fattyTransAcide: String = ""
override static func primaryKey() -> String? {
return "objectId"
}
required convenience init?(map: Map) { self.init() }
func mapping(map: Map) {
self.objectId <- map["objectId"]
self.calcium <- map["calcium"]
self.iron <- map["iron"]
self.fiber <- map["fiber"]
self.fattyTransAcide <- map["fattyTransAcide"]
}
}
class FoodRecipe: Syncable {
@objc dynamic var objectId :String = ""
@objc dynamic var title :String = ""
var ingredient = List<FoodRecipeIngredient>()
@objc dynamic var foodFact :FoodFact? //returns nil when retrieving data
override static func primaryKey() -> String? {
return "objectId"
}
required convenience init?(map: Map) { self.init() }
func mapping(map: Map) {
objectId <- map["objectId"]
title <- map["title"]
ingredient <- (map["ingredients"],ArrayTransform<FoodRecipeIngredient>())
foodFact <- map["foodFact"]
}
}
Это код, который я использую для сохранения и извлечения данных:
import Foundation
import RealmSwift
protocol BaseDao {
associatedtype T: Object
func save(list:[T])
func save(object:T)
func get() -> [T]?
func delete(list:[T])
func deleteAll()
}
extension BaseDao {
func deleteAll(){
PersistenceManager().deleteDatabase()
}
}
class PersistenceManager {
let realm = try! Realm()
var notificationToken = NotificationToken()
func deleteObjects(objs:[Object]) {
do {
try realm.write({
realm.delete(objs)
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
func saveObjects(objs: [Object]) {
print("path for realm \(String(describing: realm.configuration.fileURL))")
do {
try realm.write({
realm.add(objs, update: true)
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
func saveObject(obj: Object) {
print("path for realm \(String(describing: realm.configuration.fileURL))")
do {
try realm.write({
realm.add(obj, update: true)
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
func getObjects(type: Object.Type) -> Results<Object>? {
return realm.objects(type)
}
func deleteDatabase() {
do {
try realm.write({
realm.deleteAll()
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
}
class FoodRecipeLocalPersistence :BaseDao {
typealias T = FoodRecipe
let persistenceManager :PersistenceManager
init(persistenceManager :PersistenceManager = PersistenceManager()) {
self.persistenceManager = persistenceManager
}
func save(list: [T]) {
self.persistenceManager.saveObjects(objs: list)
}
func save(object: T) {
self.persistenceManager.saveObject(obj: object)
}
func get() -> [T]? {
guard let data = persistenceManager.getObjects(type: T.self) else {
return nil
}
return Array(data) as? [T]
}
func delete(list: [T]) {
self.persistenceManager.deleteObjects(objs: list)
}
}
Обновление 1: После дальнейшего просмотра я понял, что могу получить FoodRecipe со всеми свойствами в FoodRecipePersistence, но в моемViewModel FoodFact - это ноль!Я использую RxSwift в моей ViewModel ниже фрагмент кода:
Observable.combineLatest(selectedCategory, currentCategory, resultSelector: { (selectedCategory, currentCategory) in
switch currentCategory {
case .Food:
let category = selectedCategory as? FoodRecipeCategory
return foodRecipeLocalPersistence.get()?.filter{ $0.categoryId == category?.objectId }.map{$0} ?? []
case .Sport:
let category = selectedCategory as? ExerciseInstructionCategory
return exerciseInstructionLocalPersistence.get()?.filter{ $0.categoryId == category?.objectId }.map{$0} ?? []
}
}).asObservable().bind(to: self.shownList).disposed(by: disposeBag)
обновление 2: Когда я использую
po foodRecipe.foodFact
foodFactвыводится на консоль со всеми данными и свойствами, но когда я помещаю мышь в foodRecipe.foodFact внутри редактора, он показывает nil !!!