iPhone多線程編程初體驗
2011-06-07 17:35 佚名 互連網 我要評論(0) 字型大小:T | T
多線程編程是防止主線程堵塞,增加運行效率等等的最佳方法。而原始的多線程方法存在很多的毛病,包括線程鎖死等。
AD:
找了很長時間IPhone下多線程的編程的內容, 用到的類是UIKit的中NSThread.。
在google過程中,發現很多文都驚喜地標題著類似< 多線程的OS4來了>, 這些想正向引導一下, 0S4的亮點在於多任務,一個任務為一個進程,也叫多進程, 而多線程在早期的IPHONEOS上都是有的.
IPHONE OS中任務的概念是一個應用, 在一個時間你只能做一件事情, 即不能同時玩遊戲,同時上QQ. 而多任務的時候是可以這麼做的.
流程大概如下:
1. 建立一個線程
[NSThread detachNewThreadSelect:@selector(BeginThread)
toTarget:selft
withObject:nil];
2.線程裡做兩件,一件是幕後處理耗時間的活(dosomethinglongtime),另一件是更新UI(UpdateUI)
view plaincopy to clipboardprint?
(void) BeginThread{
[self performSelectorInBackgroud:@selector(dosomethinglongtime)
withObject:nil];
[self perfomSelectorOnMainThread:@selector(UpdateUI)
withObject:nil
watUntilDone:NO];
}
3. 那UpdateUI的資料怎麼來呢
view plaincopy to clipboardprint?
-(void)dosomethinglongtime{
// 修改共用變數varProgress, varText等等
}
{void)UpdateUI{
// 獲得共用變數varProgress, varText等等, 顯示在介面上
}
這樣就完成了一個大概的流程,但是UpdateUI裡不能用while(1),不然主線程會堵在UpdateUI的函數裡,怎麼辦呢? Google了一個方法, UpdateUI的方法做了一下修改
這樣的意思, 如果沒線程沒結束,過0.2秒再回到這個函數更新介面, 如此迴圈, 直到結束.
view plaincopy to clipboardprint?
(void)UpdateUI{
// 獲得共用變數varProgress, varText等等, 顯示在介面上
if(!finished)
[NSTimer scheduledTimerWithTimeInterval:0.2 target:self
selector:@selector(UpdateUI) userInfo:nil repeats:NO];
}
以上IPhone多線程編程的一種方法, 當然還有人提議用NSOperation和NSOperationQueue,但我試了一把,沒把效果試出來, 等有結果再回來更新. 嘿嘿.