大家好,这将是我的第一篇文章,对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之前跑步,但除非我可以与网络互动,否则我的程序无用。
提前致谢。 血浆
答案 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的包装类,然后在完全接收数据时调用你提供的完成块。