当15-20个人同时运行我的应用程序时,我的商业互联网服务器(允许600个并发连接)似乎变得迅速不堪重负。该应用程序利用NSURLSession执行许多任务,但它首先要做的是进入服务器的密码保护部分以检索包含密码的简单文本文件,以允许用户在应用程序中继续操作
一旦通过密码屏幕,该应用程序主要用作.pdf查看器,再次使用NSURLSession下载和显示用户选择的各种文件。
在测试应用程序时,有6-8个用户同时运行应用程序,它可以完美运行。当更多用户同时运行应用程序时,问题就开始了。
我的问题是NSURLSession如何与我的服务器连接,或者更重要的是“断开连接”。
我的应用程序使用选项卡控制器显示各种视图控制器,每个视图控制器都提供可供查看的文件列表。其中每个都依次加载另一个View Controller来显示所选的文件。应用程序中的每个视图控制器都在ViewDidLoad方法中使用以下代码创建NSURLSession:
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.allowsCellularAccess = YES;
sessionConfig.timeoutIntervalForRequest = 30;
sessionConfig.timeoutIntervalForResource = 60;
sessionConfig.HTTPMaximumConnectionsPerHost = 150;
sessionConfig.URLCache = NULL;
//Create the session with the newly created sessionConfig.
session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
然后我使用新创建的会话来创建downloadTask以下拉所选文件。这些会话中的每一个都可能在应用程序的生命周期内保持与服务器的连接吗?
ViewControllers都是模态的,所以我的假设是当加载新的ViewController并创建另一个会话时,新创建的会话将在ViewController被解除时终止。我不再相信这种假设是有效的。
我应该创建一个NSURLSession的单个实例(可能在app delegate中),然后从每个视图控制器引用该单个实例?这似乎是要走的路,但是我需要重写很多视图控制器,并且想先在这里问。
如果每个会话在应用程序的运行中都保持活动状态,我想我可能会在应用程序的单个实例中创建100个并发会话...很棒。
感谢您的帮助!
答案 0 :(得分:2)
创建NSURLSession是为了更容易将相同的设置应用于http连接。
您很有可能只需使用[NSURLSession sharedSession]
而无需修改。 (修改可能包括一个临时会话,以便不缓存任何数据,或者为每个请求添加相同标头数据的会话。有关详细信息,请查看NSURLSessionConfiguration。)
回到原来的问题,NSURLSession不会打开网络连接。保持一个人没有任何缺点。您可以为整个应用程序保留一个,而不是为每个UIViewController创建一个类似的应用程序。
创建NSURLSessionTask
(或其子类之一)然后在该对象上调用resume
时,会创建一个网络连接。这些是你需要注意的对象。一旦启动它,它将在后台运行,直到它完成或失败。退出当前的UIViewController不会杀死它。
有人认为你可能会做的是为每个UIViewController保留一个NSULRSession,然后添加如下内容。当您离开当前页面时,这将终止任何待处理的下载。
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[session invalidateAndCancel];
}
尝试的另一件事是向NSURLSessionConfiguration对象添加超时。
config.timeoutIntervalForRequest = 5;
config.timeoutIntervalForResource = 120;
第一个请求在距离收到的最后一个数据5秒后停止,第二个请求在整个请求上超时2分钟。玩价值观,看看他们是否做得更好。