我对如何以及何时使用 beginBackgroundTaskWithExpirationHandler
感到有些困惑。
Apple 在他们的示例中展示了在 applicationDidEnterBackground
委托(delegate)中使用它,以获得更多时间来完成一些重要任务,通常是网络事务。
在查看我的应用时,似乎我的大部分网络内容都很重要,当启动一个应用时,如果用户按下主页按钮,我希望完成它。
为了安全起见,使用 beginBackgroundTaskWithExpirationHandler
包装每个网络事务(我不是在谈论下载大块数据,主要是一些短 xml)是否被接受/良好做法?
最佳答案
如果您希望网络事务在后台继续进行,则需要将其包装在后台任务中。完成后调用 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)
}
关于ios - 正确使用 beginBackgroundTaskWithExpirationHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10319643/
相关文章:
ios - 如何防止 UINavigationBar 在 iOS 7 中覆盖 View 顶部?
objective-c - IOS:创建带有圆角的 UIImage 或 UIImageView
objective-c - 抑制警告 "Category is implementing a met
iphone - 如何从 UITableViewCell 获取 UITableView?
objective-c - 如何在 Objective-C 中检测未使用的方法和#import
iphone - 如何获得精确的时间,例如在 Objective-C 中以毫秒为单位?
objective-c - iOS 6 中用于完成 block 的 dispatch_get_cur
objective-c - Swift native 基类或 NSObject