带有performSelector的NSURLSession:

时间:2015-02-16 18:33:06

标签: ios objective-c nsurlsession nsurlsessiondatatask

我发现即使你的应用程序在最多10分钟内处于后台模式(最小化),iOS也可以运行进程,并且要解决这个问题并让它永远运行,这是必要的:

  

需要定期下载和处理新内容的应用

这就是使用NSURLSession API向我的服务器发出请求的原因:

-(void)SendFiles{
...
    NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

            if(error == nil){
            [self performSelector:@selector(SendFiles) withObject:nil afterDelay:3600.0];
            }

            }];

        [dataTask resume];

}

我们中的一些人知道即使应用程序最小化也要运行进程,我们应该使用一些标签,但是如果你使用的是API,则不再需要NSURLSession这样的事情,对吗?

对于我的项目,他需要在我的服务器上每1小时发出一次这样的请求,为此我在块completionHandler中添加了一个代码:每隔1小时调用一次执行send命令的方法文件到服务器。

我的问题是:10分钟的时间会影响选择器延迟3600秒?导致我的应用程序完全关闭,我无法将文件发送到服务器?

1 个答案:

答案 0 :(得分:2)

有几点想法:

  1. iOS 7中的十分钟窗口缩短为三分钟。

  2. 如果您使用beginBackgroundTaskWithName(或在iOS 7之前beginBackgroundTaskWithExpirationHandler)请求,则只能访问该窗口。请参阅 iOS应用程序编程指南的Executing Finite-Length Tasks部分。

    注意,我相信无论您运行连接到Xcode调试器的应用程序,此背景状态行为都会发生变化,因此请务必在实际设备上对此进行测试,并直接从设备运行应用程序,而不是通过Xcode运行。

  3. 是的,这段有限的时间会影响您拨打performSelector:afterDelay:的延迟时间为3600.0的能力。

  4. 如果您想让应用程序定期向服务器询问数据,您现在可以使用“后台获取”。请参阅应用程序编程指南中的Fetching Small Amounts of Content Opportunistically。这旨在轮询服务器以查看是否有要下载的数据。

    您只需30秒即可执行此请求。您也无法控制这些请求的时间(尽管您是否报告是否有可用数据可能会影响后续请求的时间)。