做個筆記(專案中通訊錄聯絡邏輯)
一、聯絡人載入邏輯:
第一次安裝的時候(其他時候使用快取中的)
1.首先,FriendManager - > reset
2.initUserData初始化資料 -> 載入通訊錄
loadContactItemCatchDictionaryWithCompleteBlock
[[SystemContactManagersharedSystemContactManager] initAllPeopleMapping];
通訊錄載入完成後傳送kSystemContactManagerContactChangedNotification
FriendManager接收通知,
然後再把所有的聯絡人都儲存到ContactListDAO作為快取,以便以後使用
再按字母排序聯絡人,並按RecordID,MoblieNum,UserID,作為key,分別生成三個Dic;
最後傳送kFriendManagerFriendlistUpdatedNotification通知,
UI介面接收通知,重新整理UI介面,顯示聯絡人。
3.通訊錄載入完成開始到伺服器分批匹配聯絡人,
每一批匹配完成時傳送通知
FriendManager接收通知呼叫mobileNoMatched,更新之前生成的那三個Dic,判斷是否需要重新排序,如果需要排序就重新排序聯絡人,然後最後傳送kFriendManagerFriendlistUpdatedNotification通知,
UI介面接收通知,重新整理UI介面,顯示聯絡人。
二、聯絡人匹配邏輯:
MatchMobileNoManager
開啟定時器每兩秒執行一次,如果上次還沒匹配完就10秒後在匹配,
先讀取通訊錄中所有的人,封裝成AddressBookPersonModel
然後把這個陣列傳給一個方法計算出需要到伺服器匹配的人
NSArray *needToServerMatchModels = [selfinnerCalculateModifyMobiles:matchMobileNoModelsdeletedMobiles:&deleteMobiles addedMobileModes:&addedMobiles fullToServer:YESisFullContacts:YES];
返回的needToServerMatchModels就是要向伺服器匹配的人,
(現在加了一個補償邏輯,因為新開通聯絡的通知是離線通知,當用戶的通訊錄中的聯絡人開通了RCS,而此使用者不線上,然後下一次登入的時候那個裝置上又沒有這個開通的聯絡人,就看不到新好友開通通知(依照當前通訊錄被過濾了),之後如果這個使用者又登入到原來的裝置了也不能識別出這個通訊錄中的聯絡人是開通了的使用者,最後就通過從手機號匹配庫MobileNoAndUserIDMappingDAO中查詢出所有的未開通的人,然後重新匹配一遍,當然這個補償邏輯不是每次都呼叫,而是使用者unlink或者被其他裝置踢後第一次登入時呼叫)
然後把這些要匹配的人傳給matchMobileNos:reverse:isFullMatch:block:,分批匹配,
[self matchMobileNos:needToServerMatchreverse:YESisFullMatch:hasMatch block:^(BOOL success) {
INFO_LOG_IF_ENABLE(@"asyncMatchMobileNosWithAllSystemContacts done >>, success = %d\r", success);
CFAbsoluteTime endtime = CFAbsoluteTimeGetCurrent();
infoLog(@"getSystemContacts -->matchMobileNos duration: %.3f second >>\r,threadName:%@", endtime - startime,[NSThreadcurrentThread].name);
self.isMatching =NO;
[[FriendManagersharedFriendManager] moduleRCSPersonWithMobileCount];
}];
—》 [selfmatchMobileNos:needToServerMatch batch:0 reverse:reverse isFullMatch:isFullMatch block:^(NSDictionary *mapping, NSInteger batch, BOOL success)
- 》 [selfmatchMobileNos:needToServerMatch batch:0 reverse:reverse isFullMatch:isFullMatch block:^(NSDictionary *mapping, NSInteger batch, BOOL success) (在這個函式裡面分批)
->
[self toServerMatchMobileNos:thisbatchreverse:reverse isFullMatch:isFullMatchblock:^(NSDictionary *mapping,BOOL success) (真正的跟伺服器互動的函式,呼叫信令0x07),伺服器返回匹配的人的userID,
isRcsUser
封裝成
MatchMobileNoModel *model = [mapping objectForKey:mobileNo];
model.userID = userID;
model.isRcsUser = [[m getHeader:0x03] getInt64];
每一批完成後更新匹配資料庫,然後傳送kMatchMobileNoManagerMobileNoMatchedNotification
,全部完成後傳送kMatchMobileNoManageFinishTotallyNotification
如果有一批失敗了就,5秒鐘後重新匹配