Возможно, я ошибаюсь (и действительно надеюсь, что ошибаюсь), но похоже, что вам нужно использовать грубую силу на этом. Не существует операторов set / array , которые могут помочь, а также NSPredicate , похоже, не помогает.
Я думаю, что это на самом деле немного сложно, и, похоже, вам придется заняться кодированием. Руководство по программированию основных данных гласит:
Если вы выполняете выборку напрямую, вы
обычно не следует добавлять
Предикаты на основе Objective-C или сортировка
дескрипторы запроса на выборку.
Вместо этого вы должны применить их к
результаты выборки. Если вы используете
контроллер массива, вам может понадобиться
подкласс NSArrayController, так что вы можете
не передать дескрипторы сортировки
в постоянный магазин и вместо этого сделать
сортировка после того, как ваши данные были
неправдоподобный.
Я думаю, что это применимо к вашему случаю, потому что важно учитывать, происходит ли сортировка или фильтрация сначала в запросе на выборку (когда предикат запроса на выборку и дескрипторы сортировки установлены). Это потому, что у вас будет соблазн использовать оператор набора / массива @distinctUnionOfObjects. Если список свернут до уникальной до сортировки, это не поможет. Если он применяется после сортировки, вы можете просто установить предел запроса на выборку равным 5, и вы получите свои результаты.
Учитывая документацию, я не знаю, как это будет работать. Кроме того, в этом случае может быть проще избежать NSArrayController для этой конкретной проблемы и просто использовать протокол NSTableViewDataSource, но это выходит за рамки этих вопросов и ответов.
Итак, вот один из способов сделать это:
- Создать предикат для фильтрации для
отдельные позиции счета. *
- Создать дескриптор сортировки для сортировки
позиции по номеру телефона
(которые, надеюсь, в
стандартизированный формат внутри, остальное
неприятности ждут) через @ "call.number" в вашем случае.
- Создать запрос на выборку для строки
объект сущности, с предикатом и
сортировать дескрипторы и выполнять их **.
С этими отсортированными результатами было бы неплохо, если бы вы могли легко свернуть и «уникально» их, и снова у вас возникнет соблазн использовать @distinctUnionOfObjects. К сожалению, операторы set / array здесь не помогут (их нельзя использовать непосредственно в экземплярах NSArray / NSMutableArray или NSSet / NSMutableSet). Тогда это грубая сила.
Я бы создал массив topFive и перебрал бы результаты, добавив число в topFive, если его там еще нет, пока в topFive не будет 5 элементов или пока у меня не будет результатов.
Отображение его в вашем пользовательском интерфейсе (с использованием привязок или без него), как я уже сказал, выходит за рамки этих вопросов и ответов, поэтому я оставлю его там. Мне очень хотелось бы услышать, есть ли лучший способ сделать это - это определенно один из тех «похоже, что это должно быть легко, но это не» такие вещи. : -)
* Вы также можете использовать @unionOfObjects в вашем ключевом пути во время самой выборки, чтобы получить номера вызовов позиций выбранного счета, что, вероятно, будет более эффективным при выборке, но я устал от набрав, и вы получите идею. ; -)
** На практике я бы, вероятно, ограничил запрос на выборку чем-то разумным - некоторые счета (особенно для бизнеса и подростков) могут быть довольно большими.