ios7 中弹出视图中的异步 nsurl 连接



我正在ios的弹出视图中创建一个异步NSURLconnection。为了实现异步NSURLconnection我实现了NSURLDelegate的方法。当用户点击弹出视图外部并且视图被关闭时,会出现此问题。使视图中的nsurlconnection回调和其他操作不完整。我如何确保弹出窗口中的操作在视图被关闭的情况下完全完成?我尝试在弹出视图中放置一个活动指示器,直到操作完成,但即便如此,在弹出视图外点击也会关闭视图。我不希望在操作完成之前将用户留在非活动应用程序中,而是希望在后台完成操作。

如果要发送异步连接,可以使用此方法。

获取请求

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSURLResponse *response, NSData *data, NSError *error))ourBlock {
     NSString *url = [NSString stringWithFormat:@"%@/%@", URL_API, action];
     NSURL *urlUsers = [NSURL URLWithString:url];
     NSURLRequest *request = [NSURLRequest requestWithURL:urlUsers];
     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock];
}

发布请求

-(void)placePostRequest:(NSString *)action withData:(NSDictionary *)dataToSend withHandler:(void (^)(NSURLResponse *response, NSData *data, NSError *error))ourBlock {
    NSString *urlString = [NSString stringWithFormat:@"%@/%@", URL_API, action];
    NSLog(urlString);
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // Creamos el JSON desde el data
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dataToSend options:0 error:&error];
    NSString *jsonString;
    if (! jsonData) {
        NSLog(@"Got an error: %@", error);
    } else {
        jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        NSData *requestData = [NSData dataWithBytes:[jsonString UTF8String] length:[jsonString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody: requestData];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock];
    }
}

使用示例

- (void) getMyMethod:(NSString *)myParam1
            myParam2:(NSString *)myParam2
            myParam3:(NSString *)myParam3
            calledBy:(id)calledBy
         withSuccess:(SEL)successCallback
          andFailure:(SEL)failureCallback{
    [self placeGetRequest:[NSString stringWithFormat:@"api/myMethod?myParam1=%@&myParam2=%@&myParam3=%@",myParam1, myParam2, myParam3]
                 withHandler:^(NSURLResponse *response, NSData *rawData, NSError *error) {
                     NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
                     NSInteger code = [httpResponse statusCode];
                     NSLog(@"%ld", (long)code);
                     if (code == 0){
                         // error
                     } else if (!(code >= 200 && code < 300) && !(code == 500)) {
                         NSString *string = [[NSString alloc] initWithData:rawData
                                                                  encoding:NSUTF8StringEncoding];
                         NSLog(@"ERROR (%ld): %@", (long)code, string);
                         [calledBy performSelector:failureCallback withObject:string];
                     } else {
                         // If you receive a JSON
                         NSMutableDictionary *result = [NSJSONSerialization JSONObjectWithData:rawData options:0 error:nil];
                         // If you receive an Array
                         // NSArray *result = [NSJSONSerialization JSONObjectWithData:rawData options:0 error:nil];
                         // If you receive a string
                         // NSString *result = [[NSString alloc] initWithData:rawData encoding:NSUTF8StringEncoding];
                         [calledBy performSelector:successCallback withObject:result];
                     }
                 }];

}

您必须在视图/控制器/等中进行的调用

(...)
[api getMyMethod:myParam1Value myParam2:myParam2Value myParam3:myParam3Value calledBy:self withSuccess:@selector(getMyMethodDidEnd:) andFailure:@selector(getMyMethodFailureFailure:)];
(...)
// Don't forget to set your callbacks functions or callbacks will do your app crash
-(void)getMyMethodDidEnd:(id)result{
    // your actions with the result
    // ...
}
-(void)getMyMethodFailure:(id)result{
    // your actions with the result
    // ...
}

为了防止在点击外侧时关闭弹出视图,您需要实现此委托方法

 - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
   {
      return NO;
   }  

使用操作将其关闭

 - (void)someAction
   {
      //check the operations are completed 
      .....
      .....
      [popoverController dismissPopoverAnimated:YES];
  }

最新更新