Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSMutableURLRequest在使用NSURLSession时发送2次_Objective C_Asp.net Web Api_Nsurlsession_Nsmutableurlrequest_Nsurlsessionconfiguration - Fatal编程技术网

Objective c NSMutableURLRequest在使用NSURLSession时发送2次

Objective c NSMutableURLRequest在使用NSURLSession时发送2次,objective-c,asp.net-web-api,nsurlsession,nsmutableurlrequest,nsurlsessionconfiguration,Objective C,Asp.net Web Api,Nsurlsession,Nsmutableurlrequest,Nsurlsessionconfiguration,我正在使用NSMutableURLRequest在使用时工作正常 - (void)postAsynchronousOnQueue:(NSOperationQueue*)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))completionHandler { NSURLRequest* request = [self createPostRequest]; [NSURLConnection se

我正在使用
NSMutableURLRequest
在使用时工作正常

- (void)postAsynchronousOnQueue:(NSOperationQueue*)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))completionHandler {
    NSURLRequest* request = [self createPostRequest];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:completionHandler];
}
-(NSURLRequest*)createPostRequest {
        NSMutableURLRequest* request = [[HttpRequest requestWithRelativePath:@"/photo"] toNSMutableURLRequest];
             [request setHTTPMethod:@"POST"];
             [request setHTTPBody:[self encodeParamsForUpload]];
             return request;  
}
但问题是,当我的应用程序处于后台模式时,它将无法工作

下面是我的
HttpRequest
类方法:

+(id)requestWithRelativePath:(NSString*)docpath {
    return [[HttpRequest alloc] initWithRelativePath:docpath server:server username:email password:password];
}  
-(id)initWithRelativePath:(NSString*)docpath server:(NSString*)server username:(NSString*)username password:(NSString*)password {
    if (self = [super init]) {
        docpath = [docpath stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
        _request = [self createRequestWithDocPath:docpath server:server username:username password:password];
    }
    return self;
}

- (NSMutableURLRequest*)createRequestWithDocPath:(NSString*)docpath server:(NSString*)server username:(NSString*)username password:(NSString*)password {
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@%@", server, docpath]];
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setTimeoutInterval:120.0];
    if ((username != nil) && (password != nil)){
        NSString *authStr = [NSString stringWithFormat:@"%@:%@", username, password];
        NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
        NSString *authValue = [NSString stringWithFormat:@"Basic %@", [self base64Encoding:authData]];
        [request setValue:authValue forHTTPHeaderField:@"Authorization"];
    }
    return request;
}
在中,我发现堆栈溢出
NSURLSession
在后台处理API调用。所以我使用了
nsursession
。这是我更新的代码,我做到了:

- (void)postAsynchronousOnQueue:(NSOperationQueue*)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))completionHandler {
    NSURLRequest* request = [self createPostRequest];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:completionHandler];
}
-(NSURLRequest*)createPostRequest {
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

    NSMutableURLRequest* request = [[HttpRequest requestWithRelativePath:@"/photo"] toNSMutableURLRequest];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[self encodeParamsForUpload]];
    //Create task
    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //Handle your response here
        [[NSURLSession sharedSession]invalidateAndCancel];
    }];

    [dataTask resume];
    return request; 
}
但是,当我使用
NSURLSession
时,请求发送了两次,我已经在
NSMutableURLRequest
行中设置了断点,但它只调用了一次


请帮助我解决此问题。

您的
createPostRequest
正在创建请求并通过
NSURLSession
提交。但它也会返回
NSURLRequest
,然后
postAsynchronousOnQueue
继续再次提交,这次是通过不推荐的
NSURLConnection

删除
NSURLConnection
代码,只需依靠
nsursession
发出请求即可


例如:

- (void)postAsynchronousOnQueue:(NSOperationQueue*)queue completionHandler:(void (^)(NSData *, NSURLResponse*, NSError*))completionHandler {
    NSURLSession *defaultSession = [NSURLSession sharedSession];

    NSMutableURLRequest* request = [[HttpRequest requestWithRelativePath:@"/photo"] toNSMutableURLRequest];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[self encodeParamsForUpload]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //Handle your response here
        [queue addOperationWithBlock:^{
            completionHandler(data, response, error);
        }];
    }];

    [dataTask resume]; 
}

您的
createPostRequest
正在创建请求并通过
NSURLSession
提交。但它也会返回
NSURLRequest
,然后
postAsynchronousOnQueue
继续再次提交,这次是通过不推荐的
NSURLConnection

删除
NSURLConnection
代码,只需依靠
nsursession
发出请求即可


例如:

- (void)postAsynchronousOnQueue:(NSOperationQueue*)queue completionHandler:(void (^)(NSData *, NSURLResponse*, NSError*))completionHandler {
    NSURLSession *defaultSession = [NSURLSession sharedSession];

    NSMutableURLRequest* request = [[HttpRequest requestWithRelativePath:@"/photo"] toNSMutableURLRequest];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[self encodeParamsForUpload]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //Handle your response here
        [queue addOperationWithBlock:^{
            completionHandler(data, response, error);
        }];
    }];

    [dataTask resume]; 
}

不相关,但我会避免为每个请求创建新的
NSURLSession
。我将创建它一次,并为每个请求重用它。或者只需使用
sharedSession
。我还将删除
nsursession
的无效性,前提是您以后可能会再次使用它。不相关,但我将避免为每个请求创建新的
nsursession
。我将创建它一次,并为每个请求重用它。或者只需使用
sharedSession
。我还将删除
NSURLSession
的无效性,前提是您以后可能会再次使用它。