본문 바로가기

개발/Swift

[Swift] CoreData Request에 이중필터 적용하기 (NSCompoundPredicate)

VC1 TableView에서 “운동" 을 선택했고, VC2 TableView에서 다양한 운동들이 나왔다.

VC2에 검색창이 있고 “아령" 이 들어간 운동만 출력하려고 한다면 어떻게 해야할까?

 

필터링 예시

 

그땐 2개의 NSPredicate를 적용시켜야한다.

그때 사용할 수 있는 것이 NSCompoundPredicate 이다.

이 객체는 NSPredicate를 2개 이상 받을 수 있다.

 


 

코드사용은 아래와 같다. 여러개의 NSPredicate를 배열에 넣는다.

NSCompoundPredicate(andPredicateWithSubpredicates: [categoryPredicate, addPredicate])

 

 

위와 같이 “운동”으로 한번 필터링 후, “아령” 이 들어간 것을 검색해본다면 아래와 같을 것이다.

// 파라미터 predicate 가 "아령"을 받는 부분이다.

func loadData(with request: NSFetchRequest<TodoListModel> = TodoListModel.fetchRequest(), predicate: NSPredicate? = nil) {
  // 카테고리가 "운동"인 것을 필터링한다.
  let categoryPredicate = NSPredicate(format: "parentCategory.name MATCHES %@", selectedCategory!.name!)

  if let addPredicate = predicate {
            // 여기서 복합 필터링한다.
      let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [categoryPredicate, addPredicate])
      request.predicate = compoundPredicate
  } else {
      request.predicate = categoryPredicate
  }
    // 그 후 요청한 데이터 가져오기.
  do {
      itemArray = try context.fetch(request)
  } catch {
      print("Fetch Error : \(error)")
  }
}

 

 

 

반응형