よし、バックグラウンド フェッチの実装に成功しました。そこに問題はありません。私が抱えている問題は、バックグラウンド フェッチがシミュレータとデバイスで異なる動作をすることです。
class func doInBackground(completion: () -> Void) {
let time = NSDate()
print(time)
serverPostRequest()
completion()
}
class func serverPostRequest() {
if(loopCount < 1) {
let params = self.formEncodingBuilder()!
let syncUrl: String = Constants.BASE_SERVER_URL + Constants.SYNC_URL
do {
let opt = try HTTP.POST(syncUrl, parameters: params)
opt.start { response in
if let err = response.error {
print("error: \(err.localizedDescription)")
//also notify app of failure as needed
SYNC_STATE = 1
SYNCING = false
}else{
let json = JSON(data: response.data)
if let success = json["synced"].bool {//synced, all done nothing to do anymore
SYNC_STATE = 2
SYNCING = false
}else {//process data
SyncServiceDataSource.dBOperations(json["data"])
print("after")
serverPostRequest()
}
}
}
} catch let error {
print("got an error creating the request: \(error)")
}
}else {
print("Logical error state, check server logs")
SYNC_STATE = 1
SYNCING = false
}
loopCount++
}
class SyncServiceDataSource : DataSourceProtocol {
static func dBOperations(data: JSON) {
print("count")
print(data.count)
}
}
これで、バックグラウンド フェッチの出力が良好になりました。
2016-04-20 18:47:12 +0000 論理エラー状態の後に 19 カウント、サーバー ログを確認
しかし、iPhone 5(実際の)デバイスで同じことを実行すると、
2016-04-20 18:47:12 +0000
後に何もない
2016-04-20 18:49:12 +0000
以降
SyncServiceDataSource.dBOperations(json["data"])
デバッガーを使用して実行または中断する
- バックグラウンド フェッチ 30 秒の制限にはなりません (と思います)。レスポンスは非常に大きいですが、現在私が呼び出しているリクエストは 1 つだけです。
- 間違ったコード..うーん..シミュレーターで完全に動作します。
ps応答データは比較的大きいjsonです
だから問題は私が欠けているものですか?SyncServiceDataSource.dBOperations が呼び出されないのはなぜですか