有什么关于NSURLSessionConfiguration.HTTPMaximumConnectionsPerHost我失踪了吗?

时间:2014-12-02 15:01:00

标签: ios nsurlsession

我正在尝试用NSUrlSession替换一些古老的网络代码,但将HTTPMaximumConnectionsPerHost设置为1没有任何影响。这个请求代码被调用了170次,但它在回来之前与主机建立了170个连接(在CharlesProxy中观看),这正在关闭服务器。我在这里错过了什么吗?

所有请求都转到同一个域和网址,只有参数不同。当然我可以做一些不同的事情,但HTTPMaximumConnectionsPerHost似乎应该限制连接。

目前我正在编译而不是SDK 7(由于必须支持iOS 6)但如果我可以让它工作,我可以放弃iOS 6,只支持7/8并构建vs 8.这是一个企业应用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];
}

2 个答案:

答案 0 :(得分:0)

每个主机的最大连接数意味着,当前执行的连接将被添加到队列中并等待更早的连接将完成它们的工作。 它不是限制所有计数,而是一次计数。

答案 1 :(得分:0)

好像你没有共享,但每次创建新会话。 HTTPMaximumConnectionsPerHost仅限制当前会话的连接。

来自文档

  

此限制是针对每个会话的,因此如果您使用多个会话,则您的应用可能会超出此限制。

NSURLSessionConfiguration : HTTPMaximumConnectionsPerHost

作为替代方案,您可以将discretionary属性设置为YESTRUE)。它会将所有会话中的所有连接限制为合理的数量。

NSURLSessionConfiguration : discretionary