@synchronized需要花费很多时间

时间:2015-12-24 18:02:24

标签: ios objective-c multithreading core-data

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

您能否建议我优化代码的方法?我尝试过原子,锁定和解锁,但这并没有解决我的并发问题。

1 个答案:

答案 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;
        }
     }
}