做个笔记(项目中通讯录联系逻辑)

一、联系人加载逻辑:

第一次安装的时候(其他时候使用缓存中的)

1.首先,FriendManager - > reset

2.initUserData初始化数据 -> 加载通讯录

loadContactItemCatchDictionaryWithCompleteBlock

[[SystemContactManagersharedSystemContactManager] initAllPeopleMapping]

通讯录加载完成后发送kSystemContactManagerContactChangedNotification

FriendManager接收通知,asyncInitAllFriends把通讯录中的人AddressBookPersonModel转成联系model(ContactListItemModel)以便联系人列表使用

然后再把所有的联系人都保存到ContactListDAO作为缓存,以便以后使用

 

再按字母排序联系人,并按RecordID,MoblieNum,UserID,作为key,分别生成三个Dic;


最后发送kFriendManagerFriendlistUpdatedNotification通知,

UI界面接收通知,刷新UI界面,显示联系人。


3.通讯录加载完成开始到服务器分批匹配联系人,

每一批匹配完成时发送通知kMatchMobileNoManagerMobileNoMatchedNotification

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秒钟后重新匹配


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值