當我們如果想要在cell中顯示很多高畫質的大的時候如果一下子載入很多,肯定會有卡頓現象的產生,是乙個耗時操作,我們可能會想著耗時操作的話就往子執行緒中扔,但是我們是在做ui的操作,所以我們不應該放到子執行緒中。這樣的話我們應該考慮用runloop,每次迴圈我們再去載入一張,這樣的話卡頓結果就會解決,因為相比較一次迴圈載入多張肯定好很多。
首先我們應該去監聽runloop的狀態,因為只有這樣子,我們才能去進行相應的設定讓每次睡眠前也就是說事情處理完即將進入休眠的時候再次去進行載入,這樣的話我們就應該去監聽的是達到kcfrunloopbeforewaiting這個狀態應該做的事。大致步驟如下所示。
#import "viewcontroller.h"
//載入其實就是一段**,我們可以放到block中,這樣就可以把block放在陣列裡面,然後再去乙個乙個的去載入
typedef void(^loadblock)(void);
@inte***ce viewcontroller ()
@property (nonatomic ,strong)nsmutablearray *loadtasks;
@property(nonatomic,assign)cfrunloopobserverref observer;
//設定載入的最大的數量,因為如果我們滾動的tableview的速度很快的話。就會有很多載入的任務被新增進陣列,但是我們顯示的需要的是很少的所以要做個限制
@property (nonatomic,assign) int maxcount;
@end
@implementation viewcontroller
- (void)viewdidload
-(void)addrunloopobserver
; observer = cfrunloopobservercreate(kcfallocatormalloc, kcfrunloopbeforewaiting, yes, 0, &callout, &context);
//新增觀察者,新增在common模式下面
cfrunloopaddobserver(runloop, observer, kcfrunloopcommonmodes);
//使用新增任務的**我們可以直接這麼使用
[self addtask:^];
self.observer=observer;
//先移除觀察者,如果不移除,觀察者沒有釋放,控制器不會釋放
cfrunloopremoveobserver(runloop, observer, kcfrunloopcommonmodes);
//釋放觀察者
cfrelease(observer);
}-(void)touchesbegan:(nsset*)touches withevent:(uievent *)event
void callout(cfrunloopobserverref observer, cfrunloopactivity activity, void *info)
loadblock task = vc.loadtasks.firstobject;
task();
[vc.loadtasks removeobjectatindex:0];
}//就是在陣列中新增block任務
-(void)addtask:(loadblock)task
[self.loadtasks addobject:task];
}//載入的操作
-(void)loadimage
iOS RunLoop常駐執行緒
常駐執行緒的作用 讓乙個一直存在的子執行緒,等待其他執行緒發來訊息,處理其他事件。1.設定成全域性的,如果是執行緒物件是區域性的就會死掉 property strong,nonatomic nsthread thread 2.初始化執行緒並啟動self thread nsthread alloc i...
iOS RunLoop 自己的理解
系統就為我們將主線程的main runloop隱式的啟動了。runloop顧名思義就是乙個 迴圈 他不停地執行,從程式開始到程式退出。正是由於這個 迴圈 在不斷地監聽各種事件,程式才有能力檢測到使用者的各種觸控互動 網路返回的資料才會被檢測到 定時器才會在預定的時間觸發操作 runloop只接受兩種...
display table與本身的table的區別
一 為什麼不用table系 元素?目前,在大多數開發環境中,已經基本不用table元素來做網頁布局了,取而代之的是div css,那麼為什麼不用table系 元素呢?1 用div css編寫出來的檔案k數比用table寫出來的要小,不信你在頁面中放1000個table和1000個div比比看哪個檔案...