【问题标题】:NSURLSession data task - Process retrieved dataNSURLSession 数据任务 - 处理检索到的数据
【发布时间】:2014-02-18 13:56:24
【问题描述】:

我希望我的 iOS 应用在后台从服务器下载一些产品信息。它应该在应用程序活动和非活动模式下工作。

使用NSURLSessionDataTask 我可以获取数据。但无法在非活动模式下处理数据。

您能否指导我,我是否可以在应用程序处于后台/非活动状态时处理数据?或任何其他建议。

请参阅下面的代码:

NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDataTask *sessinURLResData = [session dataTaskWithURL:urlIs completionHandler:^(NSData * dataa,NSURLResponse *response,NSError * error){
    responseData = dataa;// process the data and save in local DB
}];
[sessinURLResData resume];

【问题讨论】:

  • 我观察到与 NSURLSessionDownloadTask 相同。 NSSessionURL 是如何工作的?请提出建议。
  • 谢谢罗伯。我想在后台甚至应用程序中获取数据。按照代码下载数据但在应用程序进入前台之前没有到达 completionHandler。NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration];NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil] ;NSURLSessionDataTask * sessinURLResData = [session dataTaskWithURL:urlIs completionHandler:^(NSData * dataa,NSURLResponse * response,NSError * error){responseData = dataa;//处理数据并保存到本地DB}];[sessinURLResData resume];

标签: ios ios7 background


【解决方案1】:

至少有两种类型的后台提取:

  1. 如果您希望您的应用在不在前台运行时定期检查数据,您可以在应用的“功能”中启用“后台提取”,然后您的应用委托在performFetchWithCompletionHandler 中执行该提取。您只能执行快速(30 秒或更短)的网络请求。但是您的应用会发出网络请求,并从应用委托调用适当的完成处理程序代码,报告失败、存在新数据或缺少新数据:

    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
        NSURL *url = [NSURL URLWithString:@"..."];
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (error) {
                completionHandler(UIBackgroundFetchResultFailed);
                return;
            }
    
            BOOL foundNewData;
    
            // parse the data; setting `foundNewData` as appropriate
    
            if (foundNewData) {
                completionHandler(UIBackgroundFetchResultNewData);
            } else {
                completionHandler(UIBackgroundFetchResultNoData);
            }
        }];
    
        [task resume];
    }
    
  2. 一个完全不同类型的后台网络请求是后台NSURLSessionConfiguration,非常适合在后台进行大量下载/上传。为此,即使应用程序不再处于前台(即使应用程序已终止),您启动的任何下载/上传都将继续,并且当它们全部完成后,您的应用程序将在必要时重新启动,并且适当的委托方法将是叫。但是,要做到这一点,您必须:

    • 使用[NSURLSessionConfiguration backgroundSessionConfiguration:identifier]

    • 使用基于委托的NSURLSession(你是);

    • 使用下载或上传任务,而不是数据任务;

    • 使用使用完成块的下载/上传任务工厂方法(您必须实现委托方法);

    • 让应用代理响应handleEventsForBackgroundURLSession,捕获completionHandler;和

    • 在会话委托中实现URLSessionDidFinishEventsForBackgroundURLSession:,当您处理完所有内容后,它将调用completionHandler

还有其他技术可以做后台请求,但这是两个主要的 iOS7 特定的后台网络。您没有告诉我们您使用的是哪一个,也没有向我们展示足够的代码来诊断出了什么问题。

【讨论】:

  • 另一种方法是什么?您使用 NSURLSessionConfiguration 指定不能使用数据任务。这对我不利,因为我不下载/上传文件(我只是向服务器发送和 Http 发布请求)
  • 并不是NSURLSessionConfiguration不能使用数据任务,而是后台会话不能使用数据任务(我敢肯定这就是你的意思)。但是,撇开这一点不谈,即使您没有上传或下载任何内容,也只需使用下载或上传任务即可。例如,将其视为下载任务,“下载”仅仅是您从服务器获得的响应(例如,您的服务器向您发送的任何响应)。仅仅因为它是一个下载任务并不意味着您必须将响应实际保存为任何地方的文件......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多