0

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

4

1 回答 1

3

错误

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

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

回复

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

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

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


数据

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


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

于 2012-07-08T23:28:42.350 回答