iphone上的异步与同步方法

时间:2010-07-29 03:58:56

标签: iphone

我看到有一种同步的方法,比如我想做的事情:

-(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会变为空白,但网络活动指示器不会。有什么想法吗?感谢。

2 个答案:

答案 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];