我正在使用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/

10-12 03:41