objectsPassingTest: Vs FilterSetUsingPredicate :? - PullRequest
3 голосов
/ 04 декабря 2011

Я хочу получить AccountUser linkedAccount типа LinkedAccountFacebook, где AccountUser имеет много LinkedAccount (в базовых данных).

Что лучше использовать?

  1. objectsWithOptions:passingTest:

    NSSet *facebookLinkedAccounts =
    [activeAccountUser.linkedAccounts objectsWithOptions:NSEnumerationConcurrent passingTest:^BOOL(id obj, BOOL *stop) {
        if ([(LinkedAccount *)obj hasType:LinkedAccountTypeFacebook]) {
            *stop = YES;
            return YES;
        } else {
            return NO;
        }
    }];
    
  2. filteredSetUsingPredicate:

    NSSet *facebookLinkedAccounts =
    [activeAccountUser.linkedAccounts filteredSetUsingPredicate:
     [NSPredicate predicateWithFormat:@"type == %i", LinkedAccountTypeFacebook]];
    
  3. Выполнить запрос на выборку через NSManagedObjectContext.

Или есть лучший способ сделать это?

1 Ответ

2 голосов
/ 20 января 2012

Вызов activeAccountUser.linkedAccounts извлечет их все из базовых данных (если они являются ошибкой), при условии, что у вас настроены отношения.

Является ли `connectedAccounts 'ошибкой?т.е. уже в памяти?Если это так, я бы использовал (2.).Если данные все еще находятся в идентификаторе вашего резервного хранилища, выполните запрос на выборку с фильтрацией предикатов для необходимого вам типа учетной записи (3.)

Или, если вы все равно планируете получить все другие типы, возможно,было бы лучше получить их всех впереди.

Попробуйте их обоих бок о бок и запустите на них профилировщик времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...