2016-04-05 36 views
0

Kodlar uzun görünüyor, ancak fikir basit. Önce refreshResult() 'da, verileri NSUserDefaults (tempArray)' dan alın, daha sonra sunucudan tempArray'e yüklenen verileri ekleyin, tempArray'i en son NSUserDefaults'a kaydedin. LoadChat() 'da ikinci, NSUserDefaults verileri alın ve sohbet görünümünü oluşturmak için verileri kullanın. Sonucu yenilediğimde her şey mükemmel çalışıyor, mesaj ve görüntüyü sohbet görünümünde görebiliyorum. Ancak, uygulamayı kapatmaya ve uygulamayı tekrar açmaya zorladığımda, yenileme sonucuna yeni yüklenen veriler ortadan kalkar. Gerçekten nedenini bulamıyorsun.NSUserDefault verileri kaydedilemez. Swift

GÜNCELLEME

Ben oldukça emin nesneleri duyuyorum! Üç baskı kullandığım için boş değil: "1", "2", "3". Yeni bir ileti

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

Lütfen bir [MVCE] belirtin (http:/*** M *** ile vurgulayarak /stackoverflow.com/help/mcve). – nhgrif

cevap

0

sadece NSUserDefaultsquery.findObjectsInBackgroundWithBlock eğer döner nesnelerden nesneleri kapma konum olduğunda refreshResult sadece çağrılabilir gibi yazdırır ne Gerçek vaka, ben refreshResult önceki ilk loadChat. Kodunuzun başka bölümlerini görmeden, query.findObjectsInBackgroundWithBlock'un herhangi bir nesne döndürüp döndürmediğini görmek için bazı print ifadelerini ekleyebilirim. Nesneleri döndürürse, kesinlikle , vb değerlerini kontrol etmek için daha fazla print deyimleriyle hata ayıklayıcı işlevinin geri kalanı boyunca adım adım ilerleyin. Kesinlikle sizi işaretleyecektir.

+0

Nesneleri döndürdüğünden eminim. Lütfen güncellemeye bakın. Zaman ayırdığın için teşekkürler. –

+0

daha sonra, daha fazla kod paylaşılmalı çünkü ilk etapta refresh1() 'i çağırıyor, ilk etapta –

+0

güncellendi. RefreshResult() içindeki tüm kodlar gönderilir. –