代码看起来很长,但想法很简单。首先在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")
的值,等等。肯定会提示您。