Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Iphone 使用阻塞或类似方法从NSURLConnection获取数据_Iphone_Objective C_Ios_Xcode - Fatal编程技术网

Iphone 使用阻塞或类似方法从NSURLConnection获取数据

Iphone 使用阻塞或类似方法从NSURLConnection获取数据,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,嗨,伙计们,这将是我的第一篇文章,我对Objective-C非常陌生,尽管对编码并不完全陌生。我一直在做大量的阅读和谷歌搜索,我的很多答案都来自这个网站。所以现在我真的被困住了,我想我该问问专家了 我基本上是试图从给定的URL获取原始HTML数据,以便对其进行解析以获取信息。我已经对所有解析进行了排序,可以检索原始HTML,但是我很难理解如何在数据从NSURLConnection到达时让程序停止,这样我就可以使用它了。当前,我的程序快速通过连接,保留字符串保持为空,直到不久之后,请求将其填充。我

嗨,伙计们,这将是我的第一篇文章,我对Objective-C非常陌生,尽管对编码并不完全陌生。我一直在做大量的阅读和谷歌搜索,我的很多答案都来自这个网站。所以现在我真的被困住了,我想我该问问专家了

我基本上是试图从给定的URL获取原始HTML数据,以便对其进行解析以获取信息。我已经对所有解析进行了排序,可以检索原始HTML,但是我很难理解如何在数据从
NSURLConnection
到达时让程序停止,这样我就可以使用它了。当前,我的程序快速通过连接,保留字符串保持为空,直到不久之后,请求将其填充。我认为我需要使用“同步”连接,但这是不赞成的,因为它在处理请求时冻结了UI。我试着这样称呼它

urlData = [getURLClass getURL: @"http://www.google.co.uk"];
希望将原始HTML放入字符串
urlData
,这样我就可以解析它了

//Create the request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];

//Open NSURLConnection with 'request'
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    //If we receive something
    if (data) {
        //Pass and decode to string
        receivedData = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"Received HTML: %@", receivedData); 
    }

    //Something went wrong
    else {
       // ToDO: Sort out any errors

    }
}];

return receivedData;
当这个运行时,日志显示“Received HTML:nil”,返回值也为空,但是如果我稍等片刻,然后再次调用该类,它将被上一个请求中的数据填充。我确实尝试了另一种方法,在其中检索数据

-(void) connectionDidFinishLoading
但这给我留下了一个问题,即我无法从调用的方法“返回”数据。正如我所说,我对Objective-C非常陌生。我知道有像
ASIHTTPRequest
这样的非连续包装器,但我相信有一个比使用其他人的类更简单的答案。它还将帮助我了解,如果我能找到答案,我只需要让程序等待,而数据被接收,然后类返回它。在我能用Obj-C走路之前,我可能会尝试跑步,但除非我能与网络交互,否则我的程序是无用的

提前谢谢。
Plasma

不幸的是,苹果公司提供的SDK没有任何方便的功能来让这个超级简单。您必须使用NSURLConnection自己完成这一切。我要做的是创建一个包装类来执行NSURLConnection,然后当数据完全接收到时,它调用您提供的一个完成块。

不幸的是,Apple提供的SDK没有任何方便的函数来实现这一超级简单。您必须使用NSURLConnection自己完成这一切。我要做的是创建一个执行NSURLConnection的包装类,然后在完全接收到数据后,它调用您提供的完成块。

我为这种情况编写了一个类文件

CAURLDownload.h:

CAURLDownload.m:

基本上,您想打电话
[CAURLDownload downloadURL:URL目标:自选择器:@selector(finishedSelector:connection:)failSelector:@selector(failureSelector:)userInfo:userInfo]

URL是NSURL,userInfo是NSDictionary

基本上,您可以使用适当的参数调用该方法,并在finishedSelector中执行解析。例如:

[CAURLDownload downloadURL:[NSURL URLWithString:@"http://couleeapps.hostei.com"]
                    target:self
                  selector:@selector(downloadFinished:connection:)
              failSelector:@selector(downloadFailed:)
                  userInfo:nil];
至于方法:

- (void)downloadFinished:(NSData *)recievedData conneciton:(CAURLDownload *)connection {
    //Parse recievedData
    NSString *recievedString = [[[NSString alloc] initWithData:recievedData] autorelease];
    //Etc.
}

- (void)downloadFailed:(CAURLDownload *)connection {
    NSLog(@"Download Failed!");
    //Do something
}

这有两个好处:不锁定UI、内存友好、无需指针即可调用(单例)。

我为这种情况编写了一个类文件

CAURLDownload.h:

CAURLDownload.m:

基本上,您想打电话
[CAURLDownload downloadURL:URL目标:自选择器:@selector(finishedSelector:connection:)failSelector:@selector(failureSelector:)userInfo:userInfo]

URL是NSURL,userInfo是NSDictionary

基本上,您可以使用适当的参数调用该方法,并在finishedSelector中执行解析。例如:

[CAURLDownload downloadURL:[NSURL URLWithString:@"http://couleeapps.hostei.com"]
                    target:self
                  selector:@selector(downloadFinished:connection:)
              failSelector:@selector(downloadFailed:)
                  userInfo:nil];
至于方法:

- (void)downloadFinished:(NSData *)recievedData conneciton:(CAURLDownload *)connection {
    //Parse recievedData
    NSString *recievedString = [[[NSString alloc] initWithData:recievedData] autorelease];
    //Etc.
}

- (void)downloadFailed:(CAURLDownload *)connection {
    NSLog(@"Download Failed!");
    //Do something
}

这具有不锁定UI、内存友好和无需指针即可调用(单例)的优点。

您应该能够使用NSString函数initWithContentsOfURL执行所需操作:

NSError* error;
NSString* htmlData = [[NSString alloc] initWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:&error];
它也可能是编码的NSASCIIStringEncoding。。。但在任何情况下,它都会同步提供字符串

编辑:


更正了拼写initWithContent*s*OfURL,添加了alloc

您应该能够使用NSString函数initWithContentsOfURL执行您想要的操作:

NSError* error;
NSString* htmlData = [[NSString alloc] initWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:&error];
它也可能是编码的NSASCIIStringEncoding。。。但在任何情况下,它都会同步提供字符串

编辑:


更正了拼写initWithContent*s*OfURL,添加了alloc

尝试记录错误对象,看看出了什么问题。我完全知道出了什么问题,返回变量后会填充数据。我想知道如何阻止这种情况发生。好的,我找到了一个解决方案,基本上我删除了上面的[NSURLconnection sendAsynchronousRequest,并替换为…NSData*data=[NSURLconnection sendSynchronousRequest:request returningResponse:&响应错误:&错误];同时尝试记录错误对象以查看出现了什么问题。我完全知道出现了什么问题,返回变量后数据会被填充。我想知道如何阻止这种情况发生。好的,我找到了一个解决方案,基本上我删除了上述[NSURLconnection sendAsynchronousRequest,并替换为…NSData*data=[NSURLConnection sendSynchronousRequest:请求返回应答:&响应错误:&错误];这听起来正是我想要做的,如果不是太麻烦的话,你能解释一下或告诉我如何实现完成块吗?我看到了一些关于这个问题的评论,但从来没有看到过我理解的回复。提到了运行循环之类的事!:s显然显示了我的经验不足和无事状态e!!如果我的代码对人们有帮助的话,我很乐意把它发到某个地方,但我想你们可能都明白我到底想实现什么。这听起来正是我想要的