【发布时间】:2018-06-05 07:26:43
【问题描述】:
我正在尝试使用applicationWillResignActive() 以便在应用程序进入后台之前将一些数据同步到我的Firestore 数据库。
func applicationWillResignActive(_ application: UIApplication) {
self.uploadWantToPlay()
}
当我从applicationWillResignActive() 调用我的上传函数时,它会运行,但在下次应用程序激活之前,不会向Firestore 添加任何数据。
当我出于测试目的而不是从我的ViewControllers 之一运行相同的功能时,数据会立即添加到Firestore。
我也尝试从applicationDidEnterBackground() 调用该函数,我尝试在它自己的DispatchQueue 中运行它。但结果是一样的。
当用户即将离开应用程序并让它正确执行数据库同步时,我该如何运行此功能?
处理数据库同步的函数;
func uploadWantToPlay() {
print ("Inside uploadWantToPlay")
if let wantToPlay = User.active.wantToPlayList {
if let listEntries = wantToPlay.list_entries {
let cleanedEntries = listEntries.compactMap({ (entry: ListEntry) -> ListEntry? in
if entry.game?.first_release_date != nil {
return entry
} else {
return nil
}
})
let gamesToUpload = cleanedEntries.filter {
$0.game!.first_release_date! > Int64(NSDate().timeIntervalSince1970 * 1000)
}
DatabaseConnection().writeWantToPlayToDatabase(user: User.active,wantToPlay: gamesToUpload)
}
}
}
func writeWantToPlayToDatabase(user: User, wantToPlay: [ListEntry]) {
firebaseSignIn()
let deviceId = ["\(user.deviceId)": "Device ID"]
for entry in wantToPlay {
let wantToPlayGameRef = fireStore.collection(WANTTOPLAY).document("\(entry.game!.id!)")
wantToPlayGameRef.updateData(deviceId) {(err) in
if err != nil {
wantToPlayGameRef.setData(deviceId) {(err) in
if let err = err {
Events().logException(withError: err, withMsg: "DatabaseConnection-writeWantToPlayToDatabase(user, [ListEntry]) Failed to write to database")
} else {
print("Document successfully written to WantToPlayGames")
}
}
} else {
print("Document successfully updated in WantToPlayGames")
}
}
}
}
【问题讨论】:
-
您需要致电
beginBackgroundTaskWithExpirationHandler
标签: ios swift google-cloud-firestore ios-background-mode