我正在尝试实现一种方法,以便在MySQL数据库中记录关键消息。
在应用程序生成这些消息之后,应用程序继续尝试发送消息直到它成功到达数据库,这一点至关重要。 (用户可能处于脱机状态或可能发生其他意外情况)
但是,数据库不应该两次收到相同的消息。
日志记录非常重要,因为用户可能会在脱机时生成这些错误消息,或者可能无法成功访问数据库。
我尝试使用NSUserDefaults尝试这样做,假设我可以将每个请求存储在持久数组中,并在成功发送后删除元素。
我的第一个设计就是:
private static let defaults = UserDefaults.standard
private static let backupQueue = "Messages"
public static func log(message: String) {
var messageArray:[String] = [String]()
if (defaults.value(forKey: backupQueue) as? [String] == nil) {
defaults.set(messageArray, forKey: backupQueue)
}
messageArray = defaults.value(forKey: backupQueue) as! [String]
messageArray.append(message)
for i in (0..<messageArray.count).reversed() {
let result = sendOff(message: messageArray[i])
if (result) {
messageArray.remove(at: i)
}
}
defaults.set(messageArray, forKey: backupQueue)
}
private static func sendOff(message: String) -> Bool {
return //Return true if it was sent and false if it was not
}
它与一个巨大的疏忽完美配合。应用程序的任何类型的Web请求都应该异步处理,所以很明显我们不能立即生成真值或假值。
此外,我甚至无法弄清楚如何格式化POST请求。例如,我知道如果我转到我的网络浏览器并将http://coolSite.org/Debug.php?message="We have a problem"
作为地址,它将成功将消息发布到我的数据库。但是,当我尝试使用像this这样的技术从网站请求html时,它不起作用。在发送请求后约40秒,我不会收到任何错误消息。
因此我有两个问题: