Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何从NSURLConnection远程服务器调用返回的对象中获取值?_Objective C_Ios_Ios5_Nsurlconnection - Fatal编程技术网

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

Objective c 如何从NSURLConnection远程服务器调用返回的对象中获取值?,objective-c,ios,ios5,nsurlconnection,Objective C,Ios,Ios5,Nsurlconnection,我有一些Objective-c代码,可以对服务器进行异步(我想lol)调用,但我不太确定,处理从服务器返回的响应的正确方法是什么 我是这样做的: NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; // *************** // TODO: ok I dont really understand what this is NSOperationQueue *queue = [[NSOpe

我有一些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响应,有时只是一个类似“ok”的字符串

此外,本教程还增加了我的困惑:

根据这一点,我应该有几个单独的功能,如

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

所以我的问题是,从请求的3个变量(错误、响应、数据)中获取基本返回数据的方法是什么,我应该在什么时候实现我提到的教程建议的方法?这本教程似乎有一个更优雅的解决方案……但我不确定它是否过火。

错误

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

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

响应

在您的情况下,NSURL响应并不重要。正如苹果所说:

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

您可以使用NSURLResponse进行文件下载,仅此而已。JSON由一个对象返回


数据

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


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

错误

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

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

响应

在您的情况下,NSURL响应并不重要。正如苹果所说:

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

您可以使用NSURLResponse进行文件下载,仅此而已。JSON由一个对象返回


数据

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



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

自iOS 5.0以来,CocoaTouch包括直接与
NSData
对象一起工作的组件。它们不必转换为字符串。另外,您对
NSOperationQueue
“在线程上逐个执行”的描述暗示了串行操作,但默认情况下操作队列同时执行其操作。也许我的速度比我快。非常感谢,@Kenthomass,我会用正确的措辞编辑。但我在你的评论中有一点不同意,那就是类型(sync,async)是由操作决定的,所以NSOperationQueues可以是sync也可以是async。@CodaFi所以我有点困惑。我应该如何使用这里的队列?我真的只有两条线,对吗?远程服务器调用线程和应用程序屏幕线程?我在这里使用队列的正确方式是什么?谢谢自iOS 5.0以来,CoCoatTouch包括直接与
NSData
对象一起工作的组件。它们不必转换为字符串。另外,您对
NSOperationQueue
“在线程上逐个执行”的描述暗示了串行操作,但默认情况下操作队列同时执行其操作。也许我的速度比我快。非常感谢,@Kenthomass,我会用正确的措辞编辑。但我在你的评论中有一点不同意,那就是类型(sync,async)是由操作决定的,所以NS