使用 AFNetworking(AFHTTPClient 子类)将 JSON 发送到服务器 => 这是一个异步操作

Posted

技术标签:

【中文标题】使用 AFNetworking(AFHTTPClient 子类)将 JSON 发送到服务器 => 这是一个异步操作【英文标题】:Using AFNetworking (AFHTTPClient subclass) to send JSON to server => is this an asynchronous operation 【发布时间】:2013-01-27 18:14:24 【问题描述】:

经过大量研究,我想出了如何从我的 ios 6 客户端向我的 Rails 服务器发送NSDictionary。我用AFNetworking。下面是发送 JSON 的客户端代码。但是,我不确定这是否是异步调用,因为我看不到在哪里使用了操作队列。如果不是,那么我如何将其变为异步调用?

  -(void)sendEntryToServerAsJSON:(EntryParent*)_entryToBeSaved
  
     NSDictionary* dictToBeSerialized = [_entryToBeSaved convertEntryParentObjToDict];


     [[appAPIClient sharedClient]postPath:@"entries.json"
                          parameters:dictToBeSerialized
                             success:^(AFHTTPRequestOperation *operation, id responseObject) 
       NSLog(@"Successfully sent JSON %@", [responseObject description]);
      
                             failure:^(AFHTTPRequestOperation *operation, NSError *error)    
       NSLog(@"Could not send JSON %@", [error description]);
      ];
  

这是我的 AFHTTPClient 实现

 + (appAPIClient *)sharedClient
 
   NSLog(@"Inside appAPIClient sharedclient ");
   static appAPIClient *_sharedClient = nil;
   static dispatch_once_t oncePredicate;
   dispatch_once(&oncePredicate, ^
    _sharedClient = [[self alloc]
                     initWithBaseURL:[NSURL URLWithString:URL_STR]];
  );

   return _sharedClient;
 
 //==============================================================================

 - (id)initWithBaseURL:(NSURL *)url
 
   self = [super initWithBaseURL:url];
   if (!self)
  
    return nil;
   
   NSLog(@"init with base url - appAPIClient");
   [self registerHTTPOperationClass:[AFJSONRequestOperation class]];

   // Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];

   return self;


如果有任何反馈可以改进此代码并使其异步,我将不胜感激。

【问题讨论】:

【参考方案1】:

到a)

请求被添加到主线程运行循环中,因此它们是异步的,没有线程或队列。 runloops 有点像 C 的 select 方法

见:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html

to b) 请单独提问:)

【讨论】:

我查看了 AFNetworking 库,似乎 AFHTTPClient 在后台使用 NSOperation 队列来处理这个方法。那么这个方法在发送时会占用我的主线程吗? 嗯,它确实使用 NSOperations 来管理东西并做所有与网络无关的事情。 (例如解析 JSON)。虽然网络本身是通过主运行循环完成的,但它不会烧毁线程。都是异步的 :)

以上是关于使用 AFNetworking(AFHTTPClient 子类)将 JSON 发送到服务器 => 这是一个异步操作的主要内容,如果未能解决你的问题,请参考以下文章

ios基础篇(三十)—— AFNetworking的使用

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

iOS开发网络数据之AFNetworking使用

iOS开发之AFNetworking 3.0.4使用

如何使用 AFNetworking 设置超时

如何使用 AFNetworking 进行 json 解析