2016-04-05 10 views
0

Codes scheint lange, aber die Idee ist einfach. Zuerst in der refreshResult(), holen Sie sich die Daten von NSUserDefaults (tempArray), hängen Sie dann die Daten vom Server an tempArray an, speichern Sie zuletzt das tempArray zurück zu NSUserDefaults. Holen Sie als zweites in loadChat() die Daten von NSUserDefaults und verwenden Sie die Daten, um die Chat-Ansicht zu erstellen. Alles funktioniert perfekt, wenn ich das Ergebnis aktualisiere, kann ich die Nachricht und das Bild in der Chat-Ansicht sehen. Wenn ich jedoch erzwinge, die Anwendung zu deaktivieren und die Anwendung erneut zu öffnen, verschwinden die Daten, die gerade in Aktualisierungsergebnis geladen wurden. Wirklich kann nicht herausfinden, warum.NSUserDefault-Daten können nicht gespeichert werden, wenn das Schließen der Anwendung erzwungen wird. Swift

UPDATE

Ich bin ziemlich sicher, dass Objekte! ist nicht leer, da ich drei Drucke verwende: "1", "2", "3". realen Fall von dem, was er druckt, ich loadChat bevor refreshResult als refreshResult nur aufgerufen werden, wenn eine neue Nachricht ist

// loadChat before refresh 
3: 59 
3: 59 
3: 39 
3: 21 
// send a message from another phone 
1: 59 
1: 59 
1: 39 
1: 21 
2: 60 
2: 60 
2: 40 
2: 21 
// force to close the application(double click home button and swipe up) 
// then open the app again 
3: 59 
3: 59 
3: 39 
3: 21 



func refreshResult() { 
    //**empty the messageArray, senderArray and photoArray 
    ... 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in 
     for object in objects! { 
      self.senderArray.append(object.objectForKey("sender") as! String) 
      self.messageArray.append(object.objectForKey("message") as? String) 
      if object.objectForKey("photo") != nil { 
       if let converyPFFile = object.objectForKey("photo") as? PFFile{ 
        let temp = try! converyPFFile.getData() 
        let image = UIImage(data: temp)! 
        self.photoArray.append(image) 
       } 
      } else { 
       self.photoArray.append(nil) 
      } 
      if object.objectForKey("sender") as! String == self.userProfileName { 
       object.setObject(true, forKey: "senderDownloaded") 
      } else { 
       object.setObject(true, forKey: "otherDownloaded") 
      } 
      object.saveInBackground() 
     } 

     if objects!.count != 0 { 
      var tempLocalNameArray = [String]() 
      var tempLocalIsStringArray = [Bool]() 
      var tempLocalMessageArray = [String]() 
      var tempLocalImageArray = [NSData]() 

      if NSUserDefaults.standardUserDefaults().objectForKey("NameArray") != nil { 
       tempLocalNameArray = NSUserDefaults.standardUserDefaults().objectForKey("NameArray") as! [String] 
      } 
      if NSUserDefaults.standardUserDefaults().objectForKey("IsStringArray") != nil { 
       tempLocalIsStringArray = NSUserDefaults.standardUserDefaults().objectForKey("IsStringArray") as! [Bool] 
      } 
      if NSUserDefaults.standardUserDefaults().objectForKey("MessageArray") != nil { 
       tempLocalMessageArray = NSUserDefaults.standardUserDefaults().objectForKey("MessageArray") as! [String] 
      } 
      if NSUserDefaults.standardUserDefaults().objectForKey("ImageArray") != nil { 
       tempLocalImageArray = NSUserDefaults.standardUserDefaults().objectForKey("ImageArray") as! [NSData] 
      } 

      print("1: \(tempLocalNameArray.count)") 
      print("1: \(tempLocalIsStringArray.count)") 
      print("1: \(tempLocalMessageArray.count)") 
      print("1: \(tempLocalImageArray.count)") 

      for i in 0 ..< self.senderArray.count { 
       tempLocalNameArray.append(self.senderArray[i]) 
       if self.messageArray[i] != nil { 
        tempLocalIsStringArray.append(true) 
        tempLocalMessageArray.append(self.messageArray[i]!) 
       } else { 
        tempLocalIsStringArray.append(false) 
        let pngImageData = UIImagePNGRepresentation(self.photoArray[i]!) 
        tempLocalImageArray.append(pngImageData!) 
       } 
      } 

      print("2: \(tempLocalNameArray.count)") 
      print("2: \(tempLocalIsStringArray.count)") 
      print("2: \(tempLocalMessageArray.count)") 
      print("2: \(tempLocalImageArray.count)") 

      NSUserDefaults.standardUserDefaults().setObject(tempLocalNameArray, forKey: "NameArray") 
      NSUserDefaults.standardUserDefaults().setObject(tempLocalIsStringArray, forKey: "IsStringArray") 
      NSUserDefaults.standardUserDefaults().setObject(tempLocalMessageArray, forKey: "MessageArray") 
      NSUserDefaults.standardUserDefaults().setObject(tempLocalImageArray, forKey: "ImageArray") 

      NSUserDefaults.standardUserDefaults().synchronize() 

     } 

     self.loadChat() 
    } 
} 


func loadChat() { 
    var tempLocalNameArray = [String]() 
    var tempLocalIsStringArray = [Bool]() 
    var tempLocalMessageArray = [String]() 
    var tempLocalImageArray = [NSData]() 

    if NSUserDefaults.standardUserDefaults().objectForKey("NameArray") != nil { 
     tempLocalNameArray = NSUserDefaults.standardUserDefaults().objectForKey("NameArray") as! [String] 
    } 
    if NSUserDefaults.standardUserDefaults().objectForKey("IsStringArray") != nil { 
     tempLocalIsStringArray = NSUserDefaults.standardUserDefaults().objectForKey("IsStringArray")! as! [Bool] 
    } 
    if NSUserDefaults.standardUserDefaults().objectForKey("MessageArray") != nil { 
     tempLocalMessageArray = NSUserDefaults.standardUserDefaults().objectForKey("MessageArray")! as! [String] 
    } 
    if NSUserDefaults.standardUserDefaults().objectForKey("ImageArray") != nil { 
     tempLocalImageArray = NSUserDefaults.standardUserDefaults().objectForKey("ImageArray")! as! [NSData] 
    } 

    print("3: \(tempLocalNameArray.count)") 
    print("3: \(tempLocalIsStringArray.count)") 
    print("3: \(tempLocalMessageArray.count)") 
    print("3: \(tempLocalImageArray.count)") 

//**use the tempLocalNameArray, tempLocalIsStringArray, tempLocalMessageArray and tempLocalImageArray to create a chat view. 
+0

Bitte stellen Sie eine [MVCE] (http://stackoverflow.com/help/mcve) mit Schwerpunkt auf dem *** M ***. – nhgrif

Antwort

0

Sie nur die Objekte aus den NSUserDefaults wenn query.findObjectsInBackgroundWithBlock kehrt Objekte greifen. Ohne weitere Teile Ihres Codes zu sehen, würde ich einige print Anweisungen hinzufügen, um zu sehen, ob query.findObjectsInBackgroundWithBlock irgendwelche Objekte zurückgibt oder nicht. Wenn es Objekte zurückgibt, schrittweise durch den Rest der Funktion mit dem Debugger, mit mehr print Anweisungen, um die Werte von NSUserDefaults.standardUserDefaults().objectForKey("NameArray"), etc. zu überprüfen. Definitiv wird Sie in.

+0

Ich bin mir ziemlich sicher, dass es Objekte zurückgibt. Bitte sehen Sie mein Update. Vielen Dank für Ihre Zeit. –

+0

dann sollte mehr Code geteilt werden, weil es nicht klar ist, was 'refreshResult()' an erster Stelle –

+0

aktualisiert. Alle Codes in refreshResult() werden gepostet. –

Verwandte Themen