UIScrollview中的事件跟蹤會阻止主線程。我使用主線程來運行驅動某些動畫的計時器 - 結果是,任何用戶與可滾動視圖(向上或向下拖動等)的交互都會導致動畫(在主循環中運行)凍結。有沒有解決的辦法?UIScrollView中的事件跟蹤會阻止主線程。任何修復?
我試過RTFM關於NSRunloop(CFRunLoopAddCommonMode等),但它非常簡潔,讓我相信更好地避免修改事件優先級/線程優先級。任何人有任何見解?
UIScrollview中的事件跟蹤會阻止主線程。我使用主線程來運行驅動某些動畫的計時器 - 結果是,任何用戶與可滾動視圖(向上或向下拖動等)的交互都會導致動畫(在主循環中運行)凍結。有沒有解決的辦法?UIScrollView中的事件跟蹤會阻止主線程。任何修復?
我試過RTFM關於NSRunloop(CFRunLoopAddCommonMode等),但它非常簡潔,讓我相信更好地避免修改事件優先級/線程優先級。任何人有任何見解?
而不是使用的NSTimer的靜態構造函數之一,創建定時器對象和手動安排像這樣的將是完全不同的,當然,特別是因爲它聽起來像你」重新使用重複計時器。我想你可以看到基本的想法。
當您滾動時,運行循環進入防止執行「默認模式」任務的模式。靜態NSTimer函數全部安排在默認模式下,這就是爲什麼當你滾動時他們不會觸發。手動調度計時器可讓您指定模式,而NSRunLoopCommonModes包含滾動所使用的運行模式。
太棒了!我一直在使用:\t [[NSRunLoop mainRunLoop] addTimer:loopTimer forMode:[NSRunLoop currentMode]];仍然被阻止。你的修復工作完美。 – 2010-11-24 14:02:36
謝謝萬億!這種修復極大地增加了我的懶加載表的可用性。 – Nailer 2012-11-30 11:36:41
一個想法是讓計時器在單獨的線程上運行。當計時器觸發時,然後在主線程上運行它需要執行的操作。
編輯:
是啊,我完全忘了怎樣的UIScrollView塊幾乎一切。另一個想法(雖然非常難看)是檢查定時器是否在UIScrollView的委託方法期間觸發(即-scrollviewDidScroll
等)。這實際上是一種破解,但它基本上是我知道在滾動期間執行任何代碼的唯一方式。
NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:delayInSeconds] interval:0 target:yourObject selector:yourSelector userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[timer release];
你paramters到initWithFireDate:
謝謝,是的,我實際上已經在主線程上運行我的動畫定時器。看起來用戶事件的幕後跟蹤運行的優先級高於主線程,所以當連續的事情(如滾動)發生時,它會阻塞主線程很長一段時間... – 2010-11-20 05:19:56
@Andy Milburn:請參閱編輯另一個想法。 – 2010-11-22 20:52:22
你只能在主線程中做UI的東西 - 所以搞亂線程優先級不適用。我很好奇 - 你知道NSTimers是否停止開火,或者定時器開火,但是拒絕應用你在動畫中所做的更改? *動畫完成* UIScrollView,或*滾動視圖*內*即您是否嘗試製作動畫並更改scrollview滾動嘗試更改的相同內容? (滾動視圖Rects等)? – Brad 2010-11-20 01:49:05
謝謝布拉德 - 我希望(可能很危險)做的事情是將EventTracking模式添加到主runloop,從而允許它繼續與EventTracking runloop同時運行。被阻止的動畫實際上是在與包含scrollview的視圖完全不同的視圖上完成的。要回答你的其他問題,NSTimer完全停止發射。它似乎完全被更高優先級的跟蹤(無關)UIScrollView上的用戶事件所阻止。 – 2010-11-20 02:10:15