2017-03-13 3 views
0

Ich bin neu in Swift und ich möchte eine Bibliothek zum Herunterladen und Speichern von Daten aus JSON verwenden. Ich verwende ObjectMapperRealm und Alamofire, um dies zu tun. Ich kann die Daten mit Alamofire und ObjectMapper herunterladen, aber als ich anfing, Realm zu verwenden, ging alles schief. Das Problem ist, wenn ich ein Array in meinem Model verwendet habe, hat es gut funktioniert, aber nachdem ich Realm benutzt habe, musste ich List anstelle von Array verwenden.Herunterladen von Daten aus JSON mit ObjectMapper und Realm

Hier mein Modell ist:

class ServiceItem: Object, Mappable { 
dynamic var item: [Item]? 
//var item = List<Item>() 

required convenience init?(map: Map) { 
    self.init() 
} 

func mapping(map: Map) { 
    item <- map["Item"] 
} 
} 

class Item: Object, Mappable { 
    dynamic var id: String? 
    dynamic var parentId: String? 
    dynamic var userName: String? 
    dynamic var userAddress: String? 
    dynamic var userMegye: String? 
    dynamic var userUtca: String? 
    dynamic var userIrsz: String? 
    dynamic var userKontakt: String? 
    dynamic var userEmail: String? 
    dynamic var userPhone: String? 
    dynamic var userMobile: String? 
    dynamic var userWeb: String? 
    dynamic var userDesc: String? 
    dynamic var userImage: String? 
    dynamic var gpslat: String? 
    dynamic var gpslong: String? 

    required convenience init?(map: Map) { 
     self.init() 
    } 

    // Mappable 
    func mapping(map: Map) { 
     id <- map["id"] 
     parentId   <- map["parent_id"] 
     userName  <- map["user_name"] 
     userAddress  <- map["user_address"] 
     userMegye <- map["user_megye"] 
     userUtca <- map["user_utca"] 
     userIrsz  <- map["user_irsz"] 
     userEmail <- map["user_email"] 
     userPhone  <- map["user_phone"] 
     userMobile <- map["user_mobile"] 
     userWeb  <- map["user_web"] 
     userDesc <- map["user_desc"] 
     userImage  <- map["user_image"] 
     gpslat <- map["gpslat"] 
     gpslong  <- map["gpslong"] 
     userKontakt <- (map["user_kontakt"]) 
    } 
} 

Und hier ist meine func und speichern Daten zum Download:

func downLoadDataFromJSON() { 

    let URL = "...." 

    let item = Item() 

    Alamofire.request(URL).responseObject { (response: DataResponse<ServiceItem>) in 

     let serviceResponse = response.result.value 

     let realm = try! Realm() 

     if let allServices = serviceResponse?.item{ 
      for items in allServices { 

       print(items.id!) 
       print(items.userName!) 
      } 
     } 

    } 
} 

Der Unterschied ist, wenn ich "Array" verwenden, ist das "für" Schleife läuft und ich kann meine Daten von JSON sehen, aber wenn ich "Liste" verwende, tritt der Code nicht einmal in die Schleife ein.

Antwort

1

Das Problem ist, dass für ObjectMapper kann nicht einfach in List Typ konvertieren, Sie würden eine benutzerdefinierte Transformation dafür, etwas wie this benötigen. Aber ich hatte einige Probleme damit, da in Realm mein Modell nicht gespeichert wurde. So

wählte ich mit der folgenden Methode zu gehen:

Hier in deklarieren Sie eine andere Variable für den ObjectMapper zu arbeiten, aber es ausschließen, die von Realm gespeichert werden:

let backingItem = List<Item>() 
var item: [Item] { 
    get { 
     return backingItem.map { $0 } 
    } 
    set { 
     backingItem.removeAll() 
     backingItem.append(objectsIn: newValue) 
    } 
} 

und dann

override public static func ignoredProperties() -> [String] { 
    return ["item"] 
} 
+0

Vielen Dank für Ihre Antwort. Können Sie mir sagen, wo ich die 'ignoredProperties()' Methode benutzen soll? Es sollte mit der Liste zurückkehren? –

+0

Wie auch immer, wenn ich dies verwende, habe ich diese Nachricht erhalten: 'Alle Eigenschaften müssen Primitive, NSString, NSDate, NSData, NSNumber, RLMArray, RLMLinkingObjects oder Unterklassen von RLMObject sein. –

+0

Haben Sie die ignoredProperties-Funktion geschrieben. Das ist die Funktion, die Realm mitteilt, welche Eigenschaften nicht in der DB gespeichert werden sollen. – kerry

Verwandte Themen