2016-04-19 3 views
2

Also habe ich etwas Code, der Hintergrunddaten in meine Realm-Datenbank analysiert. Wenn ich den Aufruf ohne einen asynchronen Thread mache, benötigt die Datenbank ungefähr 10 Sekunden zum Füllen (JSON mit 1000 Einträgen) und die App bleibt während dieser Zeit stehen, weil swiftyJson langsam ist (natives JSON dauert ebenfalls etwa 2 Sekunden).Größe der Realm-Datenbank geht x100 bei Verwendung eines asynchronen Threads

Wenn ich den async Anruf hinzufüge, behebt es das Einfrieren Problem, ABER meine Datenbank ist jetzt 50 MB statt 500kb vorher .... Irgendeine Idee, was vor sich geht? Jede Hilfe ist willkommen

func loadDataForLocalCategory() { 
     let URL = "SomeURL" 
     Alamofire.request(.GET, URL).validate().responseJSON { response in 
      switch response.result { 
      case .Success: 
       let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
       dispatch_async(dispatch_get_global_queue(priority, 0)) { 

       if let value = response.result.value { 
        let realm = try! Realm() 
        let json = JSON(value) 
        for item in json["result"].arrayValue { 
         let localCategory = LocalDataCategory() 
         localCategory.id = item["id"].intValue 
         // print(item["name"].stringValue) 
         localCategory.name = item["name"].stringValue 
         try! realm.write { 
          realm.add(localCategory,update: true) 
         } 
        } 
        } 
       } 
      case .Failure(let error): 
       print(error) 
      } 
     } 
    } 

Antwort

2

Es ist in der Regel am beste Praxis in Realm zu versuchen und Batch so viele Änderungen wie Sie weniger Schreibtransaktionen (also die realm.write { } Schließung) wie möglich zu können.

Im Moment öffnen Sie eine neue Schreibtransaktion für jede Iteration der for-Schleife (dh 1000 Schreibtransaktionen), was dazu führen kann, dass die Dateigröße aufgrund der Art, in der Realm Snapshot-Daten erstellt, sich aufhellt Fäden.

Ich würde empfehlen, dass Reich Schreib Schließung außerhalb des für Schleife bewegen:

if let value = response.result.value { 
    let realm = try! Realm() 
    let json = JSON(value) 

    realm.write { 
     for item in json["result"].arrayValue { 
     let localCategory = LocalDataCategory() 
     localCategory.id = item["id"].intValue 
     // print(item["name"].stringValue) 
     localCategory.name = item["name"].stringValue 
     realm.add(localCategory,update: true) 
     } 
    } 
} 

Lassen Sie mich wissen, ob das hilft! :)

+0

Danke, es hat geholfen: D so komisch, dass es auf dem Hauptthread gut funktioniert hat, und explodiert auf dem async_thread. – SoundShock

+0

Super! Froh, dass ich helfen konnte! Haha ja, es ist genau, weil es auf einem anderen Thread ist. Realm unterhält verschiedene Kopien der gleichen Daten, so dass das Schreiben eines Threads keine Lesevorgänge auf einem anderen Thread löscht. Aber abhängig von der Anzahl der Transaktionen in separaten Threads kann dies die physische Größe auf der Festplatte beeinflussen. – TiM