這個問題遇到是偶然的,正常來講是不會出現的。可是有時候在一些極端操做狀況下,仍是出現了。數組
如今我說明下這個場景。頁面上是一個tableview
,那對應的有一個dataSource
,頁面頂部有兩個「進行中」和「已結束」切換按鈕。用戶經過切換這兩個按鈕來拉取不一樣的數據,可是呢,數據源是同一個。對應的網絡請求是同樣的,只不過是裏面請求參數的status
一個是1,一個是2。看下這個頁面的網絡數據回調處理方式:網絡
if(!self.dataSource) { self.dataSource = responseObj; } else { [self.dataSource.orderList addObjectsFromArray:responseObj.orderList]; } [tableView reload];
這個頁面的dataSource
真實的類型就是網絡請求返回的實體responseObj
的類型。tableView
的真實數據源就是裏面的orderList
。上面的代碼意思很簡單,就是若是dataSource
爲空說明是第一次加載數據,直接進行賦值。若是不爲空,說明是上拉加載更多,所以,只要向orderList
數組中添加新的數據,而後reload。這樣就完成了tableView
的數據源更新。iphone
下面再看下如何發請求的:性能
//獲取進行中的訂單 - (void)didGetOngoingOrderButtonClicked:(id)sender { self.dataSource = nil; self.request.status = "1"; [request startWithDelegate:self]; } //獲取已經結束的訂單 - (void)didGetEndOrderButtonClicked:(id)sender { self.dataSource = nil; self.request.status = "2"; [request startWithDelegate:self]; }
邏輯上都是對的,若是切換先將以前的數據源置爲nil,而後從新去拉取切換的狀態數據。可是,我用鼠標來回瘋狂的切換的時候,發現進行中的數據源裏面居然混雜着已經結束的數據源。一開始找了半天都沒發現是什麼問題,只知道數據源每次請求以前都置爲nil的。怎麼可能會出現數據源混亂的問題呢。在仔細看界面顯示的數據,都是一段進行中的,一段已經結束的。由此能夠肯定,咱們在網絡返回數據處理那邊在判斷nil的狀況時,出現了數據混亂的問題。不過,咱們可能會想到,在發起請求的時候,咱們會彈出指示器,而後阻止用戶繼續操做。這樣基本都能解決這些問題。可是若是咱們的程序是跑在了性能比較差的iphone4上時,就有可能會出現,你指示器還沒出現,可是用戶覺得點了沒有反應,因而又瘋狂的點了幾回,這樣就會發出了好幾回一樣的請求。在網絡底層那邊,咱們可能會過濾掉相同的請求,來避免此問題。對於這樣公用一個數據源的狀況,並且要處理兩個不一樣的切換狀態,若是控制不當,就有可能出現這個問題。code
看看解決的辦法,只是在請求以前先取消發出去的請求,來保證只容許處理一個轉態返回數據:ip
//獲取進行中的訂單 - (void)didGetOngoingOrderButtonClicked:(id)sender { [self.request cancel]; self.dataSource = nil; self.request.status = "1"; [request startWithDelegate:self]; } //獲取已經結束的訂單 - (void)didGetEndOrderButtonClicked:(id)sender { [self.request cancel]; self.dataSource = nil; self.request.status = "2"; [request startWithDelegate:self]; }
這個問題出現的重點是極端狀況下發出了兩個不一樣狀態的請求,在回調的時候,因爲第一個回來的是nil,因此直接賦值。可是第二個回來的時候,由於不是nil,因此直接往數組裏面添加數據,致使了數據源混亂的問題。雖然出現狀況很特殊,可是也應該引發咱們的重視。it