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

标签 objective-c ios ios5 nsurlconnection

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

最佳答案

错误

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

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

响应

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

Note: NSURLResponse objects do not contain the actual bytes representing the content of a URL. See NSURLConnection for more information about receiving the content data for a URL load.

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


数据

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


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

关于objective-c - 如何从 NSURLConnection 远程服务器调用返回的对象中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387486/

相关文章:

ios - 将 2 个 NSAttributedStrings 放在一个标签中

c# - 获取对 UINavigationController 的引用

UITableView 在不使用编辑按钮的情况下启动行重新排列

iphone - 对象的潜在泄漏-Xcode-iOS5

iphone - '+[NSInspiration调用WithMethodSignature :]: method signature argument cannot be nil' (Cocos2D)

iphone - 如何更改 iPhone SDK 中分组 TableView 中节标题的文本颜色?

ios - 核心数据一对多关系不存储其数据

ios5 - iAd 无法在 iOS 6 上运行

objective-c - 应用程序失去焦点隐藏窗口

objective-c - 如何检查方法 touchesBegan :withEvent: 中的特定事件