2012-07-08 86 views
0

我有一些Objective-C代码,使一个异步(我认为笑)调用服务器,但我不太确定,处理从服务器回来的响应的正确方法是什么?如何从NSURLConnection远程服务器调用返回的对象中获取值?

我做这样的事情:

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 

    // *************** 
    // TODO: ok I dont really understand what this is 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    // ************** 

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    {   
     ... 

因为我是很新的Objective-C的,我不能肯定,甚至哪里看如何从对象,或者如何处理得到的值NSData或NSResponse对象。

我知道我的服务器有时会发回一个JSON响应,有时只是一个字符串,如“OK”

此外,添加到我的困惑是本教程:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

根据我应该有几个独立的功能,如

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

所以我的问题是从请求中获得来自3个变量(错误,响应,数据)的基本返回数据的方式以及我应该何时实现我提到的教程中提到的方法?它看起来像教程有一个更优雅的解决方案...但我不知道是否它的矫枉过正。

回答

3

错误

NSError具有独特的小功能(特别是内部块),其中当一个变量和它的地址被传递作为参数(在这种情况下,一个简单的NSError *),所述方法预计在错误的情况下修改对象并返回一个可用的实例。在没有错误发生在正常使用的情况下,这应该是nil,我们可以登录块的完成处理的部分内:

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
{ 
( iferror) 
     NSLog(@"Connection Error - %@", [error localizedDescription]); 
}]; 

响应

NSURLResponse并不重要,你的案件。正如Apple所说:

注意:NSURLResponse对象不包含表示URL内容的实际字节 。有关接收URL加载的内容数据的更多信息,请参阅NSURLConnection以获得更多 信息。

你会使用NSURLResponse进行文件下载,就是这样。 JSON由NSURLConnection对象返回。


数据

可能是整个交易中最重要的组成部分。您的JSON响应将包含在此数据中,这意味着它必须转换为字符串,然后发送给解释器,以便我们可以将实际的ObjC对象从JSON值中提取出来。为此构建了几个广泛使用的类,包括JSON Framework,JSONKitTouchJSON


NSOperationQueue,顺便说一句,很像一个线程池,但它需要的管理角色。 NSOperationQueue对象被发送NSOperation对象,然后将其添加到其内部队列中,并在也由NSOperationQueue对象管理的线程上执行。考虑到iOS 4.x中GCD的出现,它们现在基本上没有用处,但在传统软件支持的情况下,它们对于执行异步(或同步,取决于isConcurrent属性是否在提交的操作上设置)后台线程。

+0

哇 - 惊人的回应!谢谢!! – Genadinik 2012-07-08 23:37:51

+0

随时,我的朋友。 – CodaFi 2012-07-08 23:38:06

+0

自iOS5.0起,CocoaTouch包含['NSJSONSerialization'](https://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html),它直接与'NSData'对象一起工作。他们不必转换为字符串。另外,你对'NSOperationQueue'的描述,以及“在一个**线程中一个一个地执行”的建议建议串行操作,但是默认情况下操作队列同时执行它的操作。 – 2012-07-08 23:39:56

相关问题