我有一些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"
的字符串另外,我的困惑是本教程:
据此,我应该有一些单独的功能,如
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
或
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
所以我的问题是从请求中获取3个变量(错误,响应,数据)的基本返回数据的方法是什么,何时应该实现我提到的教程建议的方法?看起来这个教程有一个更优雅的解决方案......但我不确定它是否有点过分。
答案 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 Framework,JSONKit和TouchJSON。
顺便说一句, NSOperationQueue 非常类似于线程池,但它需要管理角色。 NSOperationQueue对象被发送到NSOperation对象,然后将其添加到其内部队列并在也由NSOperationQueue对象管理的线程上执行。考虑到iOS 4.x中GCD的出现,它们现在基本没用了,但是在遗留软件支持的情况下,它们对于执行异步(或同步,取决于是否在提交时设置isConcurrent属性非常有用操作)后台线程上的任务。