【问题标题】:Manage the number of active tasks in a background NSURLSession管理后台 NSURLSession 中活动任务的数量
【发布时间】:2014-04-04 02:26:47
【问题描述】:

似乎当您在背景NSURLSession 上排队太多任务(例如数百个)时,它不会很好地工作。如何将入队任务的数量保持在一个小的固定数量,比如 10?

【问题讨论】:

  • iOS11+ 测试:NSURLSession 非常适合我处理数百个任务

标签: objective-c nsurlsession


【解决方案1】:

在负责入队任务的类中,有一个 ivar 来跟踪活动任务,例如

// In MySessionWrapper.m

@interface MySessionWrapper () {
    NSMutableSet *activeTaskIds;
}
@end

当您将任务排入队列时,您将其 ID 添加到该集合中:

[activeTaskIds addObject:@([task taskIdentifier])]

当您收到 didComplete 回调时,您会删除 ID,如果活动任务的数量低于您的 目标,您添加更多任务:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    // other stuff
    [activeTaskIds removeObject:@([task taskIdentifier])]

    if ([activeTaskIds count] < NUMBER) {
        // add more tasks
    }
}

这个系统现在正在为我工​​作。

【讨论】:

  • 粘土桥我需要在 didComplete __block UIBackgroundTaskIdentifier background_task 中添加这块吗? background_task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^ { [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }];
  • @Xcoder 关闭。你应该完全在一个 SO 问题中问这个问题,我可以给你一个更全面的答案。它们的格式也更​​好。 :)
  • 粘土桥.. 我会这样做的。我现在遇到了一些困难——我一直在关注你关于 NSURLSession 管理上传的几篇文章。我们可以聊聊吗?
  • @Clay 你认为长时间运行的后台任务会干扰 NSURLSession 的生命周期吗?我有一个疑问 - 如果我创建了一个 bgtask 并且没有结束它,那么处理后台会话事件的应用程序方法可能永远不会被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多