問題1:AFNetwork數(shù)據(jù)沒有更新回調(diào) statuCode(304)問題
最近在做項目中緩存的問題以及錯誤處理的問題,我思路是使用ETag(不知道的可以百度一下 就是一個是否更新機制 大致原理:在第一次請求該接口數(shù)據(jù)的時候服務(wù)器會返回一個ETag值給你,你需要保存到數(shù)據(jù)庫,以后請求該接口時要在請求頭中添加未過期的ETag值)進行判斷數(shù)據(jù)庫首先從數(shù)據(jù)庫獲取數(shù)據(jù),如果有數(shù)據(jù)并且不過期就顯示。然后不管是否有數(shù)據(jù)就開始進行網(wǎng)絡(luò)請求,在請求頭Header中添加一個IF-None-Match字段,這個字段的值就是你在第一次請求時返回的ETag值,服務(wù)器會根據(jù)你傳入的ETag進行判斷是否有數(shù)據(jù)更新,如果沒有更新就不返回數(shù)據(jù),錯誤代碼StatusCode為304 。這個時候問題來了,由于我使用的是AFN請求,封裝了一個底層的GET和Post請求,在底層GET方法中打印StatusCode:一直為200 縱使我傳入了ETag也沒有過期,我找了很多的地方,并沒有發(fā)現(xiàn)自己代碼有問題,到最后我新建了一個新的project做測試,發(fā)現(xiàn)并沒有問題,然后我做了對比,發(fā)現(xiàn)是字典參數(shù)的問題,之前我是直接將從外界傳入的字典放入到GET請求中,這樣就一直為200,當我重新定義個字典然后將傳入的字典加入到重定義的字典中,然后在傳入到GET請求,發(fā)現(xiàn)返回就正常了 錯誤號為StatusCode:304 沒有數(shù)據(jù)更新。我目前還不知道什么原因,過段時間在解決什么原因吧,希望知道的告訴一聲。
解決:最近花時間解決了這個問題,原來是由于對AFN不夠了解導致的,因為AFN有緩存機制,AFN會把304作為200進行返回,這就導致了不能返回304的問題,所以我就取消了AFN自動緩存具體代碼如下:
// AFN會自動把304也當成200返回了,設(shè)置下面會讓AFN忽略緩存,從而正確返回304
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
至于修改字典參數(shù)的問題,估計是AFN出了問題導致的。
問題2: 接受通知(NSNotificationCenter)多次
#介紹:
由于我的項目是醫(yī)生對患者的管理,所以當監(jiān)聽到患者綁定和解綁醫(yī)生的時候都會發(fā)送通知,到患者管理列表頁(patientsController:屬于tabbarController的第二個控制器).
問題:當監(jiān)聽患者綁定醫(yī)生的時候,接受到了3次或四次的CHNotification_refreshPatients通知;
我是在viewdidload中注冊的通知,在dealloc中remove的通知。
解決:找了一些技術(shù)論壇:有兩種答案:
1.在init中注冊通知,在delloc中移除通知。(很多人都是這么干,嘗試后無效)
2.在viewwillappear中注冊通知,在viewwilldisappear中移除通知。(嘗試有效,部分人使用此方式)
最終解決:最后發(fā)現(xiàn)接受到多次通知的原因是因為循環(huán)引用,導致控制器不釋放,每進入一次控制器就回監(jiān)聽一次通知??刂破鞑会尫牛O(jiān)聽也就不會釋放。所以當事件觸發(fā)時就會執(zhí)行多次。遇到同樣問題的朋友。一定要查看控制器是否成功釋放。
問題3:在
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
的代理方法中調(diào)用
[self.tableview setContentOffset:CGPointMake(0, 667) animated:YES];
方法無效?
解決方案:
在異步的主線程中做offset的設(shè)置。
如下:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
dispatch_async(dispatch_get_main_queue(), ^{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
[self.tableview setContentOffset:CGPointMake(0, 667 ) animated:YES];
[UIView commitAnimations];
});
}
問題4: 判斷nsindexpath是否相等出錯
介紹:在做nsindexpath 判斷是否相等的時候 我使用了indexpath1 == indexpath2 去判斷是否相等。
這種方法是錯誤 因為是兩個地址塊 永遠不會相等。
解決:
1.使用compare:經(jīng)過測試是不可取的因為一旦其中一個indexpath為nil就會返回nil就無法判斷
2.通過nsobject的判斷相等方法(isequal:)進行判斷方法