【问题标题】:How do I get the values from the objects returned by a NSURLConnection remote server call?如何从 NSURLConnection 远程服务器调用返回的对象中获取值?
【发布时间】:2012-07-08 23:14:01
【问题描述】:

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

我会这样做:

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 个变量(错误、响应、数据)中获取基本返回数据的方法是什么,我应该什么时候实现我提到的教程建议的方法?似乎本教程有一个更优雅的解决方案......但我不确定它是否矫枉过正。

【问题讨论】:

    标签: objective-c ios ios5 nsurlconnection


    【解决方案1】:

    错误

    NSError 有一个独特的小功能(尤其是在块内部),当变量及其地址作为参数传入时(在本例中为简单的 NSError*),该方法有望修改对象并返回一个可用的发生错误时的实例。在没有发生错误的正常用例中,这应该是nil,我们可以将其记录在块的完成处理程序部分中:

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

    回应

    NSURLResponse 在您的情况下并不重要。正如苹果所说:

    注意:NSURLResponse 对象不包含实际字节 表示 URL 的内容。见 NSURLConnection 了解更多 有关接收 URL 加载的内容数据的信息。

    您将使用 NSURLResponse 进行文件下载,仅此而已。 JSON 由 NSURLConnection 对象返回。


    数据

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


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

    【讨论】:

    • 从 iOS 5.0 开始,CocoaTouch 包含了NSJSONSerialization,它直接与NSData 对象一起工作。它们不必转换为字符串。此外,您对NSOperationQueue 的描述,“在a 线程上逐一执行”建议串行操作,但默认情况下,操作队列同时执行其操作。
    • 也许是我的速度超过了我。非常感谢@KenThomases,我会用正确的措辞进行编辑。但是我在您的评论中提出了一点问题,即类型(同步,异步)由操作确定,因此 NSOperationQueues 可以是同步和异步的。
    • @CodaFi 所以我有点困惑。我应该如何在这里使用队列?我真的只有2个线程,对吧?远程服务器调用线程和应用程序屏幕线程?我在这里使用队列的正确方法是什么?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2018-04-24
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多