我看到有一种同步的方法,比如我想做的事情:
-(IBAction)doNSURLConnSync {
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error = nil;
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
}
它的表现与我异步的表现方式不同:
-(IBAction)doNSURLConnASync {
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
if (connection) {
responseData = [[NSMutableData alloc] init];
[webview loadHTMLString:@"" baseURL:nil];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Network error occured"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"%s", __FUNCTION__);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[connection release]; // got passed in as a param. we are done with it now.
[webview loadData:responseData
MIMEType:nil
textEncodingName:nil
baseURL:nil];
[responseData release];
}
另外,使用我的doNSURLConnSync方法,我只是尝试加载UIWebView。有没有理由不这样做?按钮只是坐在那里并保持高亮显示,同时它试图访问网页,但与异步版本相比,最后什么都不做。
另外,对于我的异步代码中的networkactivityindicator,我想将我的UIWebView设置为空白,在我的webview加载时启用指示器,然后在页面加载后关闭网络活动指示器。但是,如果我删除了loadHTMLString方法,网络活动指示器就会按预期工作,但是使用loadHTMLString,UIWebView会变为空白,但网络活动指示器不会。有什么想法吗?感谢。
答案 0 :(得分:1)
首先,对于syncrhonous:
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
这是方法签名,当您调用同步请求时,它将返回数据供您在UIWebView上显示,并且您必须调用UIWebView来显示数据。但是,同步调用将阻止您的UI,直到所有数据都回来。因此,小心UX。
NSUrlConnection sendSynchronousRequest
对于异步,它不会阻止你的UI,用户仍然可以用它做任何他们想做的事情,比如回到上一个屏幕。因此,通常建议用于大型和长型网络
我不知道为什么它没有显示你的指标。但为什么你需要这一行:[webview loadHTMLString:@"" baseURL:nil];
。您只需在获得HTML响应后调用它
答案 1 :(得分:0)
同步请求占用主线程,您应为UI小部件更新保留该主线程。
在后台线程上执行异步请求会释放主线程以更新UI。
将您的UI更新代码(指标视图和Web视图)拉入单独的方法,使用-performSelectorOnMainThread:withObject:waitUntilDone:
[self performSelectorOnMainThread:@selector(updateWebview) withObject:nil waitUntilDone:YES];