【问题标题】:How to return the ouput if method is using NSURLConnection Asynchronous calls with blocks如何返回方法的输出是使用带有块的 NSURLConnection 异步调用
【发布时间】:2014-04-23 18:18:21
【问题描述】:

我正在使用 NSURLConnection 块方法向服务器发送请求以获取响应。我无法在块中使用 return YES 或 return NO。我该如何解决这个问题?

-(BOOL)checkForValidUrl:(NSString *)url
{
       __block int httpStatus=0;
        NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:url]];
        [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];


        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error)
         {
            httpStatus = [((NSHTTPURLResponse *)response) statusCode];
             NSLog(@"httpStatus inside block:%d",httpStatus);


         }
         ];

        return NO;
}

【问题讨论】:

    标签: ios ios5 asynchronous nsurlconnection objective-c-blocks


    【解决方案1】:

    不返回任何内容,而是传递一个完成块,该块稍后会通知调用者检查结果。您将不得不重新编写调用代码以不需要立即获得结果。

    例如,假设 200 响应意味着 URL 有效:

    -(void)checkForValidUrl:(NSString *)url completion:(void (^)(BOOL validURL))completion {
      __block int httpStatus=0;
      NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:url]];
      [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
      [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    
    
      [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
        completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
          httpStatus = [((NSHTTPURLResponse *)response) statusCode];
          NSLog(@"httpStatus inside block:%d",httpStatus);
    
          completion(200 == httpStatus);
        }
      ];
    }
    

    【讨论】:

      【解决方案2】:

      没有办法。应用调用return语句时,连接结果未知。你应该使用类似的东西

      [NSURLConnection sendAsynchronousRequest:request
                                         queue:[NSOperationQueue mainQueue]
                              completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error)
               {
                  httpStatus = [((NSHTTPURLResponse *)response) statusCode];
                   NSLog(@"httpStatus inside block:%d",httpStatus);
      
                 [_your_delegate_object connectionFinishedWithStatus:httpStatus data:responseData];
      
               }
               ];
      

      【讨论】:

        【解决方案3】:

        应该是这样的

        -(void)checkForValidUrl:(NSString *)url completion:(void(^)(BOOL success))completion {
            __block int httpStatus=0;
            NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:url]];
            [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
            [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        
            [NSURLConnection sendAsynchronousRequest:request
                                               queue:[NSOperationQueue mainQueue]
                                   completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error)
             {
                httpStatus = [((NSHTTPURLResponse *)response) statusCode];
                NSLog(@"httpStatus inside block:%d",httpStatus);
                completion(httpStatus == 200) //if Yes or No depends on the status
        
             }
             ];
        }
        

        【讨论】:

          【解决方案4】:

          您的 DataFetchController.h 文件

          - (void)beginLeadTaskWithCallbackBlock:(void (^)(NSArray *))callbackBlock;
          

          您的 DataFetchController.m 文件

          -(void)beginLeadTaskWithCallbackBlock:(void (^)(NSArray *))callbackBlock{
          
          
          // add your post code here
          
          
             [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
          
              {
                   NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                   if ([data length] >0 && error == nil && [httpResponse statusCode] == 200)
                   {
          
          
                       NSArray *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
          
          
                       NSLog(@"data %@",dictionary);
                       callbackBlock(dictionary);
          
                   }
          
               }];
          
          }
          

          阻止调用你的视图控制器

          避免内存泄漏的弱使用

           DataFetchController *getFetch=[[DataFetchController alloc]init];
           DataFetchController * __weak weakDataFetch=getFetch;
              [weakDataFetch beginLeadTaskWithCallbackBlock:^(NSArray *mm){
          
          
          
                  dispatch_async(dispatch_get_main_queue(), ^{
          
                  //update main UI 
          
                  });
          
              }];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-08
            相关资源
            最近更新 更多