2016-07-30 45 views
-1

Ich habe ein Projekt, das Objekte in Parse als ein Array finden und erhält es, wenn die App fertig gestartet wird. Aber es kann die Informationen nicht bekommen, wenn es keine Netzwerkverbindungen gibt, also denke ich, NSUserDefaults zu verwenden und zuerst die Daten zu NSUserDefaults zu speichern und von NSUserDefaults zu erhalten, wenn es offline ist. Kann mir jemand ein Beispiel für Logik geben?Wie bekomme ich Daten in NSUserDefaults, wenn offline von Parse

Dies ist der Code, den ich geschrieben habe, und ich weiß nicht, wie ich es bekomme, wenn es offline ist. das Array, das ich anhängen möchte, die Daten von Parse wird [[String]] sein.

let userDefaults = NSUserDefaults.standardUserDefaults 
    let query = ClassSub.query() 
    query.whereKey("nameOfData", containsString: "testString") 
    query!.findObjectsInBackgroundWithBlock { (busObjects: [PFObject]?, error: NSError?) -> Void in 
     if error != nil { 
      print(error) 
     } 
     for object in testObjects! { 
      let testData = object["arrayData"] as? [[String]] 
      for i in 0..<testData!.count {testData 
       testArrayappend(testData![i]) 
       self.userDefaults.setObject(NSKeyedArchiver.archivedDataWithRootObject(testData[i]), forKey: "test-time") 
      } 
     } 
    } 

der Datentyp in Parse ist [[String]] und es sieht aus wie [[ "eins", "zwei"], [ "eins", "drei"], [ "eins", "vier "]]

+2

Bitte lesen Sie die Dokumentation (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/) und posten Sie, was Sie versucht haben. – Avt

+0

Ich sage nicht, ich weiß nicht, wie man die Daten von NSUSedefaults bekomme, ich sage über die Logik, wenn es offline ist – yanamstyle

Antwort

1

ich denke, es ist besser für Sie pars ios SDK lokalen Datenspeicher zu verwenden. Mit dem lokalen Datenspeicher können Sie Ihre analysierten Objekte in einer lokalen Datenbank verankern. Wenn Sie das Netzwerk verlassen, können Sie die Daten aus Ihrer lokalen Datenbank abrufen. Ein weiterer großer Vorteil ist die saveEventually-Funktion, mit der Sie Objekte speichern können, während Sie offline sind, und diese dann wieder mit dem Server synchronisieren, sobald Sie online gehen.

Um den lokalen Datenspeicher Funktion können Sie die folgenden Schritte tun müssen, verwenden:

  1. lokalen Datenspeicher aktivieren in Parse-Config

    let configuration = ParseClientConfiguration { 
        $0.applicationId = "{PARSE_APP_ID}" 
        $0.server = "http://localhost:1337/parse" 
        $0.localDatastoreEnabled = true 
    } 
    
    Parse.initializeWithConfiguration(configuration) 
    
  2. Wenn Sie von der abgefragt werden soll Lokaler Datenspeicher (während Sie offline sind) müssen Sie nur eine zusätzliche Funktion aufrufen, bevor Sie findObjectsInBackground aufrufen, damit Ihr Code wie folgt aussehen sollte:

    let query = PFQuery(className: "MyParseObjectClassName") 
    
    // if you are in offline mode then make sure the query 
    // will access your local data store and not to the server 
    if (offlineMode){ 
        query.fromLocalDatastore() 
    } 
    
    query.findObjectsInBackgroundWithBlock { 
        (objects: [PFObject]?, error: NSError?) -> Void in 
    
    
    
        // do something with the result 
    
    
    } 
    
  3. Wenn Sie einen lokalen Datenspeicher verwenden, müssen Sie die Objekte festhalten, die von Ihrem Server abgerufen werden. Um ein Objekt zu pinnen, rufen Sie einfach pinInBackground() auf, die unter Ihrem PFObject existieren. Sie können pinAllInBackground() auch verwenden, um mehrere Objekte in einem Aufruf an Ihren lokalen Datenspeicher anzuheften. Um Ihre Objekte an Pin bitte wie folgt vor:

    let query = PFQuery(className: "MyParseObjectClassName") 
    
    // if you are in offline mode then make sure the query 
    // will access your local data store and not to the server 
    if (self.offlineMode){ 
        query.fromLocalDatastore() 
    } 
    
    query.findObjectsInBackgroundWithBlock { 
        (objects: [PFObject]?, error: NSError?) -> Void in 
    
        if (!self.offlineMode){ 
         // pin all objects 
         PFObject.pinAllInBackground(objects) 
    
    
         // pin only first object 
         let obj = objects?.first 
         obj?.pinInBackground() 
        } 
    
    } 
    

Um nun zu wissen, wenn Sie offline sind oder online empfehle ich Ihnen Reachability Bibliothek zu verwenden. Diese Bibliothek bietet zwei Blöcke: wenn Sie online sind und wenn Sie offline sind. Mit diesen Blöcken können Sie feststellen, wann Ihre App mit dem Internet verbunden ist und wann nicht. Wenn es nicht mit dem Internet verbunden ist, müssen Sie das Flag offlineMode auf true setzen, und ab jetzt funktionieren alle Abfragen gegen Ihre lokale Datenbank, andernfalls funktioniert es gegen Ihren Server.

+0

Danke für Ihre nette Erklärung. Aber ich denke eher, nicht auf Parse zu hängen, weil es wird im nächsten Jahr enden. Gibt es Gründe, warum Sie die Verwendung von NSUseDefaults nicht empfehlen? – yanamstyle

+0

HI @yanamstyle Nach Ihrem Code verwenden Sie parse iOS SDK. Wenn Sie wirklich nicht mit der Syntaxanalyse rechnen möchten, sollten Sie eine abstrakte Ebene oberhalb der REST-APIs erstellen und nicht das Parse-SDK verwenden, es sei denn, Sie führen eine Art Mapping-Arbeit hinter den Kulissen durch. Auch Parse wird heruntergefahren, aber sie haben analysiert.com-Code und release es als Open Source, die Parse-Server aufgerufen. Parse-Server kann in jedem Cloud-Provider eingesetzt werden und alle Funktionen von parse.com enthalten. Wenn Sie möchten, können Sie ihn als Lösung oder als temporäre Lösung verwenden, bis Sie Ihr eigenes Backend entwickeln. –

+0

Entschuldigung, dass Sie nicht recherchiert haben, aber ist dieser lokale Parse-Datenspeicher verfügbar, obwohl der Parse-Server eine Open Source-Quelle ist? Ich habe gehört, dass wenige Optionen nicht verfügbar sein werden, nachdem der Dienst endet, obwohl es eine Open Source – yanamstyle