如果被迫关闭应用程序,则无法保存NSUserDefault数据.敏捷的



代码看起来很长,但想法很简单。首先在refreshResult()中,从NSUserDefaults(tempArray)中获取数据,然后将从服务器加载的数据附加到tempArray,最后将tempArray保存回NSUserDefault。第二,在loadChat()中,从NSUserDefaults获取数据,并使用这些数据创建聊天视图。当我刷新结果时,一切都很完美,我可以在聊天视图中看到消息和图像。然而,当我强制关闭应用程序并重新打开应用程序时,刷新结果中刚刚加载的数据会消失。真的不知道为什么。

更新

我很确定物体!不是空的,因为我使用了三个打印:"1"、"2"、"3"。它打印的真实情况是,我在refreshResult之前先加载Chat,因为只有在有新消息时才会调用refreshResult

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

如果query.findObjectsInBackgroundWithBlock返回对象,则仅从NSUserDefaults获取对象。在没有看到代码的任何其他部分的情况下,我会添加一些print语句来查看query.findObjectsInBackgroundWithBlock是否返回任何对象。如果它确实返回了对象,那么一定要使用调试器逐步完成函数的其余部分,使用更多的print语句来检查NSUserDefaults.standardUserDefaults().objectForKey("NameArray")的值,等等。肯定会提示您。

最新更新