之前工作中的問題(一)

2021-07-28 15:38:24 字數 1479 閱讀 4456

在之前的工作中,我遇到乙個奇怪的現象,那就是首頁是有乙個自動滾動的uiscrollview的控制項,如果頁面中還有乙個uiscrollview控制項的話,如果你去拉拽第二個uiscrollview控制項的話,自動滾動的控制項會自動停下來,就感覺是有乙個暫停鍵按下去了一樣。

出現問題第一時間查了一下,原來是nsrunloop,cocoa的runloop mode。

我把runloop理解為一種cocoa下的一種訊息迴圈的機制,用來處理各種訊息事件。我們在開發的時候一般並不需要手動去建立乙個runloop,因為在程式進入mainthread之後其實就為我們建立了預設的的mainrunloop,通過[nsrunloop currentrunloop]我們就可以得到當前執行緒對應的runloop物件,而我們需要留意的是在多個runloop之間訊息的通知方式。

接上面說到的,開啟乙個nstimer實質上是當前runloop中註冊了乙個新的事件源。而當scrollview在滾動的時候,當前mainrunloop是處於uitrackingrunloopmode,在該模式下,不會處理 nsdefaultrunloopmode的訊息(因為runloop model不一致),而nstimer在建立後的runloop(b)缺省會以nsdefaultrunloopmode與當前context的runloop(a)進行通訊。要想在scrollview滾動的同時也接受其他runloop的訊息,則需要改變兩者之間的runloopmode

[[nsrunloop currentrunloop] addtimer:timer

formode:nsrunloopcommonmodes];

新增一下nsrunloop的介紹

二、runloopmode

nsdefaultrunloopmode 這是大多數操作中使用的模式。

nsconnectionreplymode 該模式用來監控nsconnection物件。你通常不需要在你的**中使用該模式。

nsmodalpanelrunloopmode cocoa使用該模式來標識用於modal panel(模態面板)的事件。

nseventtracking(uitrackingrunloopmode) cocoa使用該模式來處理使用者介面相關的事件。

nsrunloopcommonmodes 這是一組可配置的通用模式。將input sources與該模式關聯則同時也將input sources與該組中的其它模式進行了關聯。對於cocoa應用,該模式預設的包含了default,modal以及event tracking模式。

常見的兩種 runloop 模式是 nsdefaultrunloopmode 和 nsrunloopcommonmodes 這兩種模式

乙個常見的問題就是,主線程中乙個 nstimer 新增在 default mod e中,當介面上有一些 uiscrollview 的滾動頻繁發生導致 run loop 執行在uitraking mode 中,從而這個timer沒能如期望那般的執行。所以,我們就可以把這個timer加到nsrunloopcommonmodes中來解決(ios中)。

工作中的問題

工作中的領悟 在工作中,每個人都會遇到這樣那樣的問題,那麼有些年輕的人就會對問題反感,覺得不出現問題最好,很多年前我也這樣,後來慚慚的,我的看法有所轉變,應該積極的心態去看問題,有出現問題,至少說明 水是活的,不是一潭死水 前幾天突然有了更深的領悟,出現問題後解決問題的關鍵是什麼,有些人會說當然是 ...

工作中遇到的問題

1.環境oracle9 vs2008 問題 aspnet提示 無法載入 dll oramts.dll 找不到指定的模組。異常來自 hresult 0x8007007e 翻來覆去折騰了好久最後終於解決方法是 執行oracle安裝檔案增加oracle windows inte ces 模組功能。糾結啊!...

工作中遇到的問題

問題背景 第二天領導要去給客戶演示專案,讓我在演示電腦上部署我們的專案。由於我們的專案的資料庫使用的是oracle 10g,但是我從來沒有進行過導資料庫和還原資料庫的操作,第一次操作都是找度娘,而且還是很迷茫。剛開始我一直想辦法在我的plsql上把資料庫匯出來,但是一直摸不到竅門,而且我們的資料庫較...