ios - 正确使用 beginBackgroundTaskWithExpirationHandle

我对如何以及何时使用 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

objective-c - 如何删除 MKMapView 上的所有注释

objective-c - 更改 UIButton 文本