Производительность NSPredicate, очень медленная

121
12

У меня есть NSPredicade, который выглядит

NSPredicate * predicate = [предикат NSPredicateWithFormat: @"((strasse.checks CONTAINS [cd] YES) AND (raumattribute.schalter CONTAINS [cd] YES)) ИЛИ ((strasse.standort.ortcheck CONTAINS [cd] YES) AND (raumattribute.schalter CONTAINS [cd] YES)) ИЛИ ((strasse.standort.ortcheck CONTAINS [cd] YES) AND (raumattribute.schalter CONTAINS [cd] NO) ИЛИ (strasse.checks CONTAINS [cd] YES) AND (raumattribute.schalter СОДЕРЖИТ [cd] НЕТ)) ИЛИ (strasse.standort.ortcheck CONTAINS [cd] NO) "];

Но производительность очень медленная. Есть ли способ сделать это проще и быстрее?

спросил(а) 2012-04-05T11:39:00+04:00 8 лет, 11 месяцев назад
1
Решение
61

Во-первых, вы можете упростить свой предикат, чтобы он выглядел следующим образом:

NSPredicate *predicate =
[NSPredicate predicateWithFormat:
@"(raumattribute.schalter CONTAINS YES OR raumattribute.schalter CONTAINS NO) AND \
(strasse.checks CONTAINS YES OR strasse.standort.ortcheck CONTAINS YES) OR \
strasse.standort.ortcheck CONTAINS NO"];

Тогда, если мы предположим, что raumattribute.schalter и strasse.standort.ortcheck содержат только логические значения, мы можем снова упростить предикат:

NSPredicate *predicate =
[NSPredicate predicateWithFormat:
@"raumattribute.schalter.@count > 0 AND \
(strasse.checks CONTAINS YES OR strasse.standort.ortcheck.@count > 0) OR \
strasse.standort.ortcheck CONTAINS NO"];

ответил(а) 2012-04-05T12:29:00+04:00 8 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема