我正在做一个项目,我使用NSURLConnection连接到网页,以便能够监视返回的状态代码(200 OK / 404错误)。如果我将状态代码接收为404,并将状态代码接收为200,我希望将用户发送到顶部URL www.domain.com,我希望将该页面加载到Webview中。我通过创建一个新请求已经看到了这个问题的几种实现,但是我觉得这是没有必要的,因为您已经在第一个请求中收到了html,所以我只想将该HTML加载到webView中。
所以我尝试使用[webView loadHTMLFromString:baseURL:],但它并不总是有效,我注意到当我在connectionDidFinnishLoading中用html打印带有html的NSString时,它有时为null,并且当我通过打印来监视这些情况时, didReceiveData中的html中最后一个数据包的随机数为NULL(介于2到10之间)。总是相同的网页不会被加载。如果我使用[webView loadRequest:myRequest]将它们加载到我的webView中,它将始终有效。我的实现看起来像这样,也许你们中的某人可以看到我在做错什么。
我通过单击按钮创建了我的第一个请求。
-(IBAction)buttonClick:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://www.domain.com/page2/apa.html"];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:url]
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if( theConnection )
{
webData = [[NSMutableData data] retain];
}
else
{
}
}
然后,我通过将请求强制转换为NSHTTPURLResponse来访问状态代码,然后根据状态代码设置Bool,来监视didReceiveResponse方法中的响应代码。
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSHTTPURLResponse *ne = (NSHTTPURLResponse *)response; if ([ne statusCode] == 200) { ok = TRUE; } [webData setLength: 0]; }
然后我检查connectionDidFinnishLoading中的布尔值。如果我登录html NSString,则会得到网页的来源,因此我知道它不是一个空字符串。
-(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *html = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:@"http://www.domain.com/"]; if (ok) { [webView loadHTMLString:html baseURL:url]; ok = FALSE; } else { // Create a new request to www.domain.com } }
webData是一个实例变量,我像这样将其加载到didReceiveData中。
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[webData appendData:data];
}
我正在做一个项目,我使用NSURLConnection连接到网页,以便能够监视返回的状态代码(200 OK / 404错误)。我想将用户发送到顶部URL ...
我假设webData
是您的类的实例变量。我认为您的问题是您没有将webData
设置为从NSURLConnection
获取的数据。尝试这样的事情:
您正在混合执行连接的两种方法-同步和异步。如果异步在同步之前完成,则将webData
重新初始化为空字符串。因此,即使同步填充的webData
也将被清除。