2015-05-04 2 views
0

У меня есть 3 уровня вложен цикл:Заменить Для петель с NSPredicate для вызова Core Data

 for (Region *region in group.associatedRegions) { 
      for (Boundary *regionBoundary in region.boundaries) { 
       for (Boundary *groupBoundary in group.boundaries) { 
        if ([groupBoundary.boundaryID isEqualToNumber:regionBoundary.boundaryID]) { 
         [boundarySet addObject:groupBoundary]; 
        } 
       } 
      } 
     } 

Это работает. Это достаточно быстро, что не замедляет приложение. Мне это не нравится. У меня сильное отвращение к этому уровню гнездования.

Я уверен, что смогу сделать то же самое с поиском NSPredicate. Мой SQL не так хорош, поэтому я не уверен, с чего начать.

Group, Region и Boundary все Core DataNSManagedObject s.

Каждый Group имеет отношение «многие ко многим» к границам и отношение «1 ко многим» к регионам. Каждый Region имеет отношение «многие ко многим» к границам.

Суть в том, что Group имеет набор границ, которые он может видеть. A Region имеет набор границ, которые он может видеть. A Region может содержать Boundary, который Group не может видеть, поэтому его необходимо исключить.

Итак, для каждого Region мне нужно найти набор границ, которые могут видеть как Group, так и Region.

Любые предложения?

ответ

0

Если честно, я не проверял это, и я даже не знаю, будет ли он успешно разбираться. Но даже если это не совсем то, что вы хотите, оно может дать некоторые идеи для его вариаций. Предполагая, что вы выборки Boundary объектов, которые имеют отношение к groupsGroups лицу, которое, в свою очередь, имеет отношение к associatedRegionsRegions лица:

NSPredicate *predicate = [NSPredicate predicateWithFormat:"SUBQUERY(groups, $G, $G = %@ AND SUBQUERY($G.associatedRegions, $R, SUBQUERY($R.boundaries, $B, self = $B)[email protected] >0)[email protected] >0))[email protected] > 0", group]; 

Что я надеюсь, что это делает выборку Boundary объектов, где: есть представляет собой, по меньшей мере, одну группу, которая a) соответствует выбранным group и b) имеет по меньшей мере один Region, который имеет по меньшей мере один Boundary, который является границей.

Смежные вопросы