所以有兩種方式來解決這個問題,一是自己開 Thread 來用時做好幾件事,二是使用委託處理的方式,把要做的事情委託出去,等事情做完後,被委託的人會通知你事情已經處理完了。這也就是 iOS 一直強調的 delgate model。
自己開 Thread 並不適合用在 iT邦幫忙 App 裡,因為我必需要知道網頁資料何時會下載完畢,等下載完畢後,再把載入等待畫面給移除。所以我需要找到一個能幫我下載網頁資料,然後下載完後能通知我的一個類別,那個就是 - NSURLConnection。
NSURLConnection 宣告使用的程式碼如下:
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ithelp.ithome.com.tw/?tab=share"]];
- [NSURLConnection connectionWithRequest:request delegate:self];
它需要兩個參數,一個是 NSURLRequest 物件,另一個是 delegate 物件。上面的程式碼把 delegate 指向自己(self),也就是目前所在的類別來接受 NSURLConnect 的事件。最重要的有四個事件處理的方法:
- //是否收到網站的回應
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
- [htmlData setLength:0];
- }
- //收到網站傳回的資料
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
- [htmlData appendData:data];
- }
- //網頁資料下載完畢
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
- NSLog(@"Succeeded! Received %d bytes of data",[htmlData length]);
- NSLog(@"%@", [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding]);
- }
- //網路連線錯誤
- - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
- [connection release];
- NSLog(@"Connection failed! Error - %@ %@",
- [error localizedDescription],
- [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
- }
htmlData 是個 NSMutableData 的物件,當 NSURLConnect 連上網站時,我先把 htmlData 清空準備來接收網頁資料。NSURLConnection 會把網頁資料一段一段下載回來,每當下載一部份時,didReceiveData 方法會收到通知,這時我把資頁資料給存放進 htmlData 物件裡。等到全部下載回來後,會呼叫 connectionDidFinishLoading 方法,這時我就把網頁的資料給印出來...
當下載的過程中發生錯誤時,會呼叫 didFailWithError 的方法,這時我會印出錯誤訊息,看看發生了什麼事。
沒有留言:
張貼留言