我正在使用doubango库来制作聊天应用程序。它同步来自设备的本机联系人,但如果联系人的数量非常多,则需要花费大量时间,让我们说超过1000个联系人。
在分析时我发现@synchronized
需要花费很多时间。核心数据中存在并发性。我有一个父母MOC和一个孩子MOC。
我发布的代码,请查看@synchronized。
- (NgnContact *)getNGNGroupContactForConversationId:(NSString*)conversationId managedObjectContext:(NSManagedObjectContext *) moc
{
NgnContact *contactObj = [[NgnContact alloc]init];
// NSMutableArray *collectionContactList = [[NSMutableArray alloc] initWithArray:[[CoreDataManager sharedDataManager] getAllContactsAndGroupsFromRCSDBTimeStampSorting : YES managedObjectContext:moc]];
NSMutableArray *collectionContactList;
@synchronized([AppDelegate sharedInstance].globalContactListLock)
{
collectionContactList = [NSMutableArray arrayWithArray:[AppDelegate sharedInstance].globalContactListTimestampSorted];
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"group_id = %@", conversationId];
NSArray *filteredRCBArry = [collectionContactList filteredArrayUsingPredicate:predicate];
if([filteredRCBArry count] > 0)
{
contactObj = [filteredRCBArry objectAtIndex:0];
}
return contactObj;
}
您能否建议我优化代码的方法?我尝试过原子,锁定和解锁,但这并没有解决我的并发问题。
答案 0 :(得分:1)
我想知道是什么让你认为@synchronized是问题所在。根据我的经验,@ synchronized需要几十纳秒,这就是全部。在@synchronized语句中,您调用globalContactListTimestampSorted - 该方法需要多长时间?然后你复制那个数组;这需要时间。
然后你使用一种相当无效的方法来找到具有正确group_id的对象。如果你做了很多,那么你应该有一个字典,其中group_id为关键字。可能有一个关系group_id - >数据库中的数据库记录。
即使这样也应该快得多:
@synchronized([AppDelegate sharedInstance].globalContactListLock)
{
for (NgnContact* contact in [AppDelegates sharedInstance].globalContactListTimestampSorted] {
if ([contact.group_id isEqualToString:conversationId]) {
contactObj = contact;
break;
}
}
}