[解決済み] beginBackgroundTaskWithExpirationHandlerの正しい使い方
2022-11-13 11:20:15
質問
をいつどのように使うのか、少し混乱しています。
beginBackgroundTaskWithExpirationHandler
.
Apple は例として、これを
applicationDidEnterBackground
デリゲートで、重要なタスク(通常はネットワークトランザクション)を完了するためのより多くの時間を得るために使用する例を示しています。
私のアプリを見ると、ネットワーク関連のものはほとんど重要なもののようで、1つが開始されたら、ユーザーがホームボタンを押した場合にそれを完了させたいと考えています。
したがって、すべてのネットワークトランザクション (大きなデータの塊をダウンロードすることについて話しているわけではなく、ほとんどはいくつかの短い xml) を
beginBackgroundTaskWithExpirationHandler
でラップすることは、安全な方法なのでしょうか?
どのように解決するのですか?
ネットワークトランザクションをバックグラウンドで継続させたい場合は、バックグラウンドタスクでラップする必要があります。また
endBackgroundTask
を呼び出すことも非常に重要です。そうしないと、割り当てられた時間が経過した後にアプリが終了してしまいます。
私のはこんな感じです。
- (void) doUpdate
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self beginBackgroundUpdateTask];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
// Do something with the result
[self endBackgroundUpdateTask];
});
}
- (void) beginBackgroundUpdateTask
{
self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundUpdateTask];
}];
}
- (void) endBackgroundUpdateTask
{
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}
私の場合は
UIBackgroundTaskIdentifier
プロパティがあります。
Swiftで同等のコード
func doUpdate () {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let taskID = beginBackgroundUpdateTask()
var response: URLResponse?, error: NSError?, request: NSURLRequest?
let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)
// Do something with the result
endBackgroundUpdateTask(taskID)
})
}
func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
return UIApplication.shared.beginBackgroundTask(expirationHandler: ({}))
}
func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) {
UIApplication.shared.endBackgroundTask(taskID)
}
関連
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] NSIntegerとintの使い分けについて
-
[解決済み】iPhoneアプリを終了させる正しい方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み] swiftで電子メールアドレスを検証する方法は?