Objective c ios5中的异步网络操作

Objective c ios5中的异步网络操作,objective-c,ios,networking,ios5,Objective C,Ios,Networking,Ios5,无论我在哪里看到人们明确地使用队列或运行循环来进行网络操作。我应该在iOS 5中仍然这样做,还是应该改用它?这是在iOS>=5中执行网络操作的首选方法吗?我无法回答其他人的偏好,但我自己使用了

无论我在哪里看到人们明确地使用队列或运行循环来进行网络操作。我应该在iOS 5中仍然这样做,还是应该改用它?这是在iOS>=5中执行网络操作的首选方法吗?

我无法回答其他人的偏好,但我自己使用了
简言之,这是NSURLConnection接口的巨大改进,依情况而定。对于简单的事情,新的基于块的API使生活更加轻松。但是,与实现
nsurlconnectionelegate
方法相比,您会失去一些控制


例如,无法取消使用此方法启动的连接,也无法在下载所有数据之前处理响应(例如,解析标题)。

您可以使用iOS 4和GCD执行类似操作

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

    NSData *data = [NSURLConnection sendSynchronousRequest:blah returningResponse:response error:blah];
    //process response body here

    dispatch_async(dispatch_get_main_queue(), ^{

        //Update UI Code here
        self.textView.text = [[NSString alloc] initWithData:data];

    });
});
此代码和发布的代码OP的问题在于,一旦建立连接,您就无法取消它们。 取消ViewDidDesive上的请求对于提高应用程序的性能有很大帮助。我在书中对此进行了广泛的讨论

您需要第三方网络框架(如MKNetworkKit或RestKit)或现已失效的ASITP)的第二个原因是用于身份验证。大多数web服务要求您使用NSURLCredential(HTTP Basic或HTTP Digest或Windows NTLM或oAuth)进行身份验证

如果您推出自己的代码,仅此一项就需要几天的时间。并不是说你不应该这么做。但是没有必要这样做,因为所有这些第三方框架都被广泛使用,并且与您自己的代码相比,其中的机会、错误或性能问题更少。

我已经编写了一个比较多种方法的报告,包括NSURLConnectionReactiveCocoa

反应性方法 如果你想真正喜欢异步网络调用,你可以试试。ReactiveCocoa允许您定义表示每个网络请求的信号。它让你可以

#导入
// ...
-(RACSignal*)信号获取网络步骤1{
NSURL*url=。。。;
return[RACSignal createSignal:^(RACSignal*(id订户){
NSURLRequest*request1=[nsurlRequestRequestWithURL:url];
AFJSONRequestOperation*operation1=[AFJSONRequestOperation JSONRequestOperationWithRequest:请求成功:^(NSURLRequest*请求,NSHTTPURLRResponse*响应,id JSON){
[subscriber sendNext:JSON];
[用户发送完成];
}失败:^(AFHTTPRequestOperation*操作,NSError*错误){
[订户发送错误:错误];
}];
[操作1启动];
返回零;
}
}
-(无效)你的方法{
[[self-signalGetNetworkStep1]订阅文本:^(id*x){
//执行自定义业务逻辑
}];
}

如果您还不知道的话,可以看看AFNetworking。您不能取消发送到
sendAsynchronousRequest:queue:completionHandler:
NSOperation队列中的
NSOperation
吗?NSOperation可以取消。但这不一定会取消操作。只有当您获得委托c时allbacks,您有机会取消它。例如,如果您的NSURLConnection下载了100MB的数据,而用户中途取消了它,您可以取消它并在didReceiveData:delegate回调中执行清理。您无法取消操作(至少在没有内存泄漏的情况下)如果您不使用NSURLConnection委托。仅对此进行扩展:取消
NSOperation
实际上并不会停止它。它只是将其标记为“已取消”这取决于您的操作来处理这个事实。正如Mugunth所指出的,Cocoa无法在任意操作启动后停止它。这将破坏内存管理。因此,除非您在操作中对
isCanceled
执行各种检查,
cancel
不会有多大作用。您不会免费获得取消。method还缺少进度通知,这对于大下载来说非常重要。
#import <ReactiveCocoa/ReactiveCocoa.h>
// ...

-(RACSignal*)signalGetNetworkStep1 {
   NSURL* url = ...;
   return [RACSignal createSignal:^(RACDisposable *(id subscriber) {
      NSURLRequest *request1 = [NSURLRequest requestWithURL:url];
      AFJSONRequestOperation *operation1 = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
         [subscriber sendNext:JSON];
         [subscriber sendCompleted];
      } failure:^(AFHTTPRequestOperation *operation, NSError *error){
         [subscriber sendError:error];
      }];
      [operation1 start];
      return nil;
   }
}

-(void) yourMethod {
   [[self signalGetNetworkStep1] subscribeNext:^(id *x) {
      // perform your custom business logic
   }];
}