使用NSURLConnection而不是stringWithContentsOfURL

时间:2011-05-06 09:56:29

标签: iphone xml delegates

伙计们,我正在使用以下代码从我服务器上的.php脚本中检索XML响应:

 NSString *xmlString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]
 encoding:NSUTF8StringEncoding error:&error];

//tried also: if(error)
if(!xmlString)
{
    NSString * errorString = [NSString stringWithFormat:@"Unable to download xml data (Error code %i )", [error code]];
    UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
    [errorAlert release];
}

//*** now I have a touchXML xPath query code that extracts what I need from XML

我的.php脚本今天无法运行,我的iApp在没有任何警报,错误或通知的情况下冻结了吗?我认为上面的代码会处理错误,但它没有???

A)然后它捕获了什么类型的错误?

然后我记得我应该尝试使用NSURLConnection及其委托方法来捕获发生的任何错误。

//Inside viewDidLoad method        
NSMutableData *responseData = [[NSMutableData alloc] init];

NSURL *baseURL = [[NSURL URLWithString:self.chosenDrawRss] retain];

NSURLRequest *request = [NSURLRequest requestWithURL:baseURL];

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

NSString *xmlString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];

我使用这种方法的问题是app在后台运行Connection并继续执行viewDidLoad中的其余代码,所以我不得不重新组织我的代码,将其移动到我调用的另一个方法委托方法connectionDidFinishLoading。我遇到的问题是我的委托方法没有被调用。好吧,除了 didFailWithError:之外的所有内容,如果我尝试加载不存在的URL。

更新 调用委托方法,但调用委托方法需要一分钟左右,直到警告消息弹出...

B)我可以使用stringWithContentsOfURL,如果发生任何事情,仍然会向用户发出警报吗?

C)如果没有,那么我需要帮助设置NSURLConnection方法?我的意思是,我在这里缺少的是为什么不调用我的委托方法?

我真的希望我的问题有意义:D →

1 个答案:

答案 0 :(得分:0)

如果在didFailWithError中调用了委托方法,那么我想它甚至会被调用 connectionDidFinishLoading。通过在委托方法中启用断点来检查并跟踪流。在调用委托之前,函数可能已经发生了。

NSString *xmlString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]
应在您的委托connectionDidFinishLoading方法和

中调用

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [responseData appendData:data];
}

我不明白为什么警报会在一分钟后弹出,除非你在显示之前进行一些处理。