我正在使用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;
}
您能建议我一些优化代码的方法吗?我曾尝试过原子,锁定和解锁,但这并不能解决我的并发问题。
最佳答案
我想知道是什么让您认为@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;
}
}
}
关于ios - @synchronized需要很多时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34456367/