在应用再次激活之前,iOS applicationWillResignActive任务才会执行

时间:2018-06-05 07:26:43

标签: ios swift google-cloud-firestore ios-background-mode

我正在尝试使用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")
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据Apple documentation

  

移动到后台的应用程序预计将进入后台   尽可能快地保持静止状态,以便它们可以被暂停   由系统。如果您的应用程序处于任务中间并需要一个   很少有额外的时间来完成那个任务,它可以调用   beginBackgroundTaskWithName:expirationHandler:或   beginBackgroundTaskWithExpirationHandler:UIApplication的方法   对象请求一些额外的执行时间。打电话给   这些方法暂时延迟暂停您的应用程序,并给予它   一点额外的时间来完成它的工作。完成这项工作后,   你的应用必须调用endBackgroundTask:方法让系统   知道它已经完成并且可以暂停。

因此,您需要做的是在暂停应用程序时执行有限长度的任务。这将使您的应用程序有足够的时间将您的记录同步到服务器。

示例摘录:

let items = [{id:'1',token:'jj'},{id:'2',token:'kk'}];

let indexToRemove = items.findIndex((eachElem) => {return eachElem.id == 2})
items.splice(indexToRemove, 1)
console.log(items)

有关详细信息,请参阅此article