使用 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 发送到服务器 => 这是一个异步操作的主要内容,如果未能解决你的问题,请参考以下文章