一。舉例說明 編程
[self performSelectorOnMainThread:@selector(RefreshCellForLiveId:) 多線程
withObject:userinfo 函數
waitUntilDone:YES]; oop
該方法的做用是在主線程中,執行制定的方法(代碼塊)。 spa
參數: 線程
@selector(RefreshCellForLiveId:)就是,要定義咱們要執行的方法。 orm
withObject:userinfo 對象
定義了,咱們執行RefreshCellForLiveId:方法時,傳入的參數對象。類型是id。(咱們能夠傳入任何參數) 隊列
waitUntilDone:YES]; 事件
指定,當前線程是否要被阻塞,直到主線程將咱們制定的代碼塊(RefreshCellForLiveId:方法)執行完。
注意:
1.當前線程爲主線程的時候,waitUntilDone:YES參數無效。
2.該方法,沒有返回值
3.該方法主要用來用主線程來修改頁面UI的狀態。
二。詳細說明
在項目中,經常用到performSelectorXXX之類的方法,並且有不少相似方法;今天就來召集一下!
1.performSelectorOnMainThread:withObject:waitUntilDone:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
在主線程上執行指定的方法,使用默認的模式(NSDefaultRunLoopMode)。
默認的模式指:主線程中的方法進行排隊,是一個循環隊列,而且循環執行。
參數:
aSelector:要在主線程執行的方法,該方法不能有返回值,而且只能有一個參數。
arg:要傳遞的參數,若是無參數,就設爲nil
wait:要執行的aSelector方法,是否立刻執行。
若是設置爲YES:等待當前線程執行完之後,主線程纔會執行aSelector方法;
設置爲NO:不等待當前線程執行完,就在主線程上執行aSelector方法。
若是,當前線程就是主線程,那麼aSelector方法會立刻執行。
該方法用途:由於iPhone編程,對UI的修改,只能在主線程上執行。能夠用該方法來完成UI的修改。
2.performSelector:withObject:afterDelay:
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
在當前線程中執行指定的方法,使用默認模式,並指定延遲。
參數:
aSelector:指定的方法。含義同上,不在贅述。
anArgument:同上
delay:指定延遲時間(秒)。
3.performSelector
咱們經常用到如下3個方法,分別爲:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
這三個方法相同點都有一個要執行的方法,不一樣之處在於參數個數不一樣,參數個數分別爲0,1,2。通常會先使用respondsToSelector方法判斷是否能響應該某方法,能得話經過上面三個方法中的一個調用執行方法。
補充:
Run loop 至關於 win32 裏面的消息循環機制,它可讓你根據事件/消息(鼠標消息,鍵盤消息,觸摸事件,計時器消息等)來調度線程。
好比:在觸摸 UIView 時之因此可以激發 touchesBegan/touchesMoved 等等函數被調用。系統會自動爲應用程序的主線程生成一個與之對應的 run loop 來處理其消息循環。讓調用更加簡單。也避免了繁瑣,複雜的操做。
一句話:Run loop是一種消息處理機制!
三。後臺前臺的問題。
NSObject類的performSelectorOnMainThread和performSelectorInBackground能夠實現簡單的多線程編程技術
一、- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
建立一個線程在子線程執行,aSelector表明了新建立的線程,arg是傳入的參數
二、- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
該方法的做用是在主線程中,執行制定的方法(代碼塊)。
參數:
@selector就是,要定義咱們要執行的方法。
withObject:arg定義了,咱們執行方法時,傳入的參數對象。類型是id。(咱們能夠傳入任何參數)
waitUntilDone:YES指定,當前線程是否要被阻塞,直到主線程將咱們制定的代碼塊執行完。
注意:
1.當前線程爲主線程的時候,waitUntilDone:YES參數無效。
2.該方法,沒有返回值
3.該方法主要用來用主線程來修改頁面UI的狀態。