我正在尝试用NSUrlSession替换一些古老的网络代码,但是将HTTPMaximumConnectionsPerHost设置为1并没有任何效果。这个请求代码被调用了170次,但是在一切恢复正常之前,它与主机建立了170个连接(在CharlesProxy中进行监视)。我在这里想念什么吗?
所有请求都转到相同的域和url,但参数不同。当然,我可以做一些不同的事情,但是HTTPMaximumConnectionsPerHost似乎应该限制连接。
目前,我正在使用SDK 7进行编译(由于必须仍然支持iOS 6),但是如果我可以使用它,我可以放弃iOS 6,仅支持7/8并构建vs8。这是在企业应用程序BTW中。
+ (NSURLSession*) sharedSession
{
static NSURLSession* session;
static dispatch_once_t once;
dispatch_once(&once, ^{
NSURLSessionConfiguration * sessionConfig = [NSURLSessionConfiguration ephemeralSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.HTTPMaximumConnectionsPerHost = 1;
sessionConfig.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicyNever;
sessionConfig.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
session = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:nil
delegateQueue:nil];
});
return session;
}
+ (void) createRequestWithPayload2:(HttpRequestPayload *)payload
success:(void (^)(CommunicationResponse * response))success
failure:(void (^)(NSError * error))failure
progress:(void (^)(TaskStatus status))progressStatus
{
NSURLSession* session = [RequestSender sharedSession];
NSString * url = [NSString stringWithFormat:@"%@/%@", payload.baseURL, payload.urlParams];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:payload.method];
[request setAllHTTPHeaderFields:payload.headers];
if ( payload.body )
{
[request setHTTPBody:payload.body];
}
//NSLog(@"Request:\n%@",request);
NSURLSessionDataTask * task =
[session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *resp, NSError *error)
{
dispatch_async(dispatch_get_main_queue(),
^{
if ( error )
{
NSLog(@"%@",error);
failure(error); }
else
{
NSHTTPURLResponse *response = (NSHTTPURLResponse*) resp;
//NSLog(@"%@",response);
//NSLog(@"%@",data);
CommunicationResponse* cr = [CommunicationResponse new];
[cr set_commStatus:response.statusCode];
[cr set_response:data];
success(cr);
}
});
}];
[task resume];
}
最佳答案
似乎您不是在共享,而是每次都创建新会话。 HTTPMaximumConnectionsPerHost仅限制当前会话上的连接。
从文档中
此限制是每个会话的,因此,如果您使用多个会话,则您的应用整体上可能会超过此限制。
NSURLSessionConfiguration : HTTPMaximumConnectionsPerHost
或者,您可以将discretionary
属性设置为YES
(TRUE
)。它将所有会话中的所有连接限制为合理的数量。
NSURLSessionConfiguration : discretionary