如何从NSURLConnection远程服务器调用返回的对象中获取值?

时间:2012-07-08 23:14:02

标签: objective-c ios ios5 nsurlconnection

我有一些Objective-c代码对服务器进行异步(我认为lol)调用,但我不太确定,处理从服务器返回的响应的正确方法是什么?

我这样做:

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响应,有时只是一个像#34; 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个变量(错误,响应,数据)的基本返回数据的方法是什么,何时应该实现我提到的教程建议的方法?看起来这个教程有一个更优雅的解决方案......但我不确定它是否有点过分。

1 个答案:

答案 0 :(得分: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的内容。有关更多信息,请参见NSURLConnection   有关接收URL加载的内容数据的信息。

您可以使用NSURLResponse进行文件下载,这就是它。 JSON由NSURLConnection对象返回。


数据

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


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