2016-04-05 14 views
0

コードは長く見えますが、そのアイデアは簡単です。まずrefreshResult()でNSUserDefaults(tempArray)からデータを取得し、サーバーからロードされたデータをtempArrayに追加し、最後にtempArrayをNSUserDefaultsに保存し直します。次にloadChat()でNSUserDefaultsからデータを取得し、データを使用してチャットビューを作成します。結果をリフレッシュするとすべてが完璧に機能し、チャットビューでメッセージと画像を見ることができます。しかし、アプリケーションをオフにしてアプリケーションを再度開くと、リフレッシュ結果にロードされたばかりのデータが消えます。本当に理由を知ることはできません。アプリケーションを強制終了するとNSUserDefaultデータを保存できません。 Swift

UPDATE

私はかなり確信してオブジェクトよ! 「1」、「2」、「3」の3つのプリントを使用しているので空ではありません。それが印刷さ何の レアル場合、私はあなただけNSUserDefaultsquery.findObjectsInBackgroundWithBlock場合を返すオブジェクトからオブジェクトをつかんでいる新しいメッセージ

// 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

[MVCE](http: *** M ***を重視しています。 – nhgrif

答えて

0

があるときrefreshResultにのみ呼び出すこととしてrefreshResult前に最初のloadChat。コードの他の部分を見ることなく、query.findObjectsInBackgroundWithBlockがオブジェクトを返すかどうかを調べるために、print文を追加します。オブジェクトを返す場合は、デバッガを使用して残りの関数をステップ実行し、NSUserDefaults.standardUserDefaults().objectForKey("NameArray")などの値を確認してください。

+0

私はそれがオブジェクトを返すことを確信しています。私の更新を見てください。あなたの時間をありがとう。 –

+0

最初の場所で 'refreshResult()'を呼び出すものが明確でないため、より多くのコードを共有する必要があります。 –

+0

が更新されました。 refreshResult()内のすべてのコードが転記されます。 –

関連する問題