2010-07-29 59 views
0

同步方法我看到有同步的方法,就像如果我想要做這樣的事情:異步VS iPhone上

-(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]; 
} 

-(IBAction)doNSURLConnSync { 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSError *error = nil; 
    NSURLResponse *response = nil; 
    [NSURLConnection sendSynchronousRequest:request          returningResponse:&response               error:&error]; 
} 

它是如何比我做異步執行不同

另外,與我的doNSURLConnSync方法,我只是試圖加載一個UIWebView。有沒有理由不這樣做?該按鈕剛好位於此處並保持突出顯示狀態,但它嘗試訪問網頁,但與異步版本相比,最終沒有任何結果。

此外,對於我的異步代碼中的networkactivityindicator,我想將我的UIWebView設置爲空白,當我的webview加載時使指示器亮起,然後在頁面加載後關閉網絡活動指示器。但是,如果我刪除了loadHTMLString方法,則網絡活動指示器按其應有的方式工作,但對於loadHTMLString,UIWebView將變爲空白,但網絡活動指示器不會。有什麼想法嗎?謝謝。

回答

1

首先,對於syncrhonous:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 

這是方法的簽名,當你調用同步請求,它西港島線返回數據,爲您顯示在UIWebView的,你必須在UIWebView的來電顯示數據。但是,同步呼叫將阻止您的用戶界面,直到所有數據返回。所以,要小心用戶體驗。

NSUrlConnection sendSynchronousRequest

對於異步,它不會阻止你的用戶界面,用戶仍然可以做自己想做的事情的一切,就像回到以前的屏幕。所以,通常情況下,這是建議大,長網

我不知道爲什麼它不顯示您的指標。但爲什麼你需要這條線:[webview loadHTMLString:@"" baseURL:nil];。您只需在獲得HTML響應後調用它即可。

+0

這是一類任務只是加載實際之前做出的WebView空白因爲我們以幾種不同的方式訪問了網頁,並且應該顯示不同的方法。 – Crystal 2010-07-29 16:21:51

0

一個同步請求將主線程關聯起來,您應該爲UI小部件更新保留一個同步請求。

在後臺線程上執行異步請求可釋放主線程以更新UI。

拉你的UI更新代碼(指標視圖和Web視圖)爲獨立的方法,稱他們在主線程與-performSelectorOnMainThread:withObject:waitUntilDone:

[self performSelectorOnMainThread:@selector(updateWebview) withObject:nil waitUntilDone:YES]; 
+0

嗨Alex Reynolds,我想在我的代碼中實現同樣的事情,你能讓我知道如何在後臺線程上調用同步請求嗎? – 2012-04-12 07:15:15

+0

你不知道。在後臺線程中運行任務的重點是使其異步。如上所示,在主線程上運行你的任務,如果你想讓它同步。 – 2012-04-12 13:32:25