gpt4 book ai didi

swift - 如果强制关闭应用程序,NSUserDefault 数据将无法保存。 swift

转载 作者:行者123 更新时间:2023-11-30 13:32:19 26 4
gpt4 key购买 nike

代码看似很长,但思路很简单。首先在refreshResult()中,从NSUserDefaults(tempArray)中获取数据,然后将从服务器加载的数据追加到tempArray中,最后将tempArray保存回NSUserDefaults。其次,在 loadChat() 中,从 NSUserDefaults 获取数据并使用该数据创建聊天 View 。当我刷新结果时,一切都很完美,我可以在聊天 View 中看到消息和图像。但是,当我强制关闭应用程序并再次重新打开应用程序时,刷新结果中刚刚加载的数据消失了。实在是查不出原因。

更新

我非常确定对象!不为空,因为我使用了三个打印:“1”、“2”、“3”。它打印内容的真实情况,我在refreshResult之前先loadChat,因为只有在有新消息时才会调用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") 等。肯定会提示您。

关于swift - 如果强制关闭应用程序,NSUserDefault 数据将无法保存。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com