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

时间:2012-03-05 21:27:41

标签: iphone objective-c ios xcode

大家好,这将是我的第一篇文章,对Objective-C来说还是一个新手,虽然不是全新的编码。我一直在做很多阅读和很多谷歌搜索,我的很多答案来自这个网站。所以现在我真的被困了,我想是时候我问专家了。

我基本上是尝试从给定的URL获取原始HTML数据,以便我可以解析它以获取信息。我已经对所有解析进行了排序,并且可以检索原始HTML但是我很难理解当数据从NSURLConnection到达时如何让程序停止以便我可以使用它。目前我的程序在连接过程中突然显示并且保持String保持为空,直到它被请求填充后不久。我相信我需要使用“Syncronous”连接,但这是不赞成的,因为它在处理请求时冻结了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之前跑步,但除非我可以与网络互动,否则我的程序无用。

提前致谢。 血浆

3 个答案:

答案 0 :(得分:2)

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

NSError* error;
NSString* htmlData = [[NSString alloc] initWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:&error];

编码可能也是 NSASCIIStringEncoding ...但无论如何它会同步为你提供字符串。

编辑:

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

答案 1 :(得分:1)

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

CAURLDownload.h:
http://localhostr.com/file/vGtIIpO/CAURLDownload.h

CAURLDownload.m:
http://localhostr.com/file/TAieiAE/CAURLDownload.m

基本上,你想打电话给 [CAURLDownload downloadURL:URL target:self selector:@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,内存友好和可调用而不需要指针(单例)的优点。

答案 2 :(得分:0)

不幸的是,由Apple提供的SDK没有任何便利功能来使这超级简单。您必须使用NSURLConnection自己完成所有操作。我所做的是创建一个执行NSURLConnection的包装类,然后在完全接收数据时调用你提供的完成块。