2015-09-04 76 views
0

处理我的应用程序中涉及过滤发送到tableview的对象的一部分。我曾尝试使用CompoundNSPredicate,但结果没有显示。如果我分别执行每个过滤器,我可以为一种类型的对象调用fetchrequest,但是当我尝试使用第二行在相同的循环条件下调用第二种类型的对象时,第二个对象完全不会​​出现。例如,对于我所在的地方:过滤多个条件下的核心数据对象

let fetchRequest = NSFetchRequest(entityName: "Cards") 
    let warriorpredicate = NSPredicate(format: "cardClass = %i", 1) 
    let shamanpredicate = NSPredicate(format: "cardClass = %i", 2) 
    let roguepredicate = NSPredicate(format: "cardClass = %i", 3) 
    let paladinpredicate = NSPredicate(format: "cardClass = %i", 4) 
    let hunterpredicate = NSPredicate(format: "cardClass = %i", 5) 
    let druidpredicate = NSPredicate(format: "cardClass = %i", 6) 
    let warlockpredicate = NSPredicate(format: "cardClass = %i", 7) 
    let magepredicate = NSPredicate(format: "cardClass = %i", 8) 
    let priestpredicate = NSPredicate(format: "cardClass = %i", 9) 
    let minionpredicate = NSPredicate(format: "cardClass = %i", 10) 
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptor] 
    if ((passedDeckObject?.classSelected.classname = "Warrior") != nil) { 
     fetchRequest.predicate = warriorpredicate 
    } else { 
     if ((passedDeckObject?.classSelected.classname = "Shaman") != nil) { 
      fetchRequest.predicate = shamanpredicate 
      fetchRequest.predicate = minionpredicate 
     } else { 
      if ((passedDeckObject?.classSelected.classname = "Rogue") != nil) { 
       fetchRequest.predicate = roguepredicate 
      } 

      if ((passedDeckObject?.classSelected.classname = "Paladin") != nil) { 
       fetchRequest.predicate?.isEqual(paladinpredicate) 
       fetchRequest.predicate?.isEqual(minionpredicate) 
      } else { 

       if ((passedDeckObject?.classSelected.classname = "Hunter") != nil) { 
        fetchRequest.predicate?.isEqual(hunterpredicate) 
        fetchRequest.predicate?.isEqual(minionpredicate) 
       } else { 
        if ((passedDeckObject?.classSelected.classname = "Druid") != nil) { 
         fetchRequest.predicate?.isEqual(druidpredicate) 
         fetchRequest.predicate?.isEqual(minionpredicate) 
        } else { 
         if ((passedDeckObject?.classSelected.classname = "Warlock") != nil) { 
          fetchRequest.predicate?.isEqual(warlockpredicate) 
          fetchRequest.predicate?.isEqual(minionpredicate) 
         } else { 
          if ((passedDeckObject?.classSelected.classname = "Mage") != nil) { 
           fetchRequest.predicate?.isEqual(magepredicate) 
           fetchRequest.predicate?.isEqual(minionpredicate) 
          } else { 
           if ((passedDeckObject?.classSelected.classname = "Priest") != nil) { 
            fetchRequest.predicate = priestpredicate 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    return fetchRequest 

} 

某些代码看上去不同,但是那是因为我在每一个不同的线我给使用我试图左右逢源减去compoundpredicate尝试这表明什么都没有实例测试。

+0

所以,如果类名是萨满,例如,你想与cardClass = 2,选择卡片或10? – pbasdf

+0

正确!这就是我正在寻找的! – Matthew

+0

你在NSCompoundPredicate的正确路径上:'fetchRequest.predicate = NSCompoundPredicate.orPredicateWithSubpredicates(shamanpredicate,minionpredicate)'work? – pbasdf

回答

0

对此的回答有多种方式。有可能被用于实际做什么,我一直在寻找做很多方法,但最简单的最优雅的解决方案是:

func listFetchRequest() -> NSFetchRequest { 

    let requiredClassName = passedDeckObject!.classSelected.classname 
    var requiredCardClasses = [Int]() 
    let fetchRequest = NSFetchRequest(entityName: "Cards") 
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
    switch(requiredClassName) { 
     case "Warrior": 
     requiredCardClasses = [1,10] 
     case "Shaman": 
     requiredCardClasses = [2,10] 
     case "Rogue": 
     requiredCardClasses = [3,10] 
     case "Paladin": 
     requiredCardClasses = [4,10] 
     case "Hunter": 
     requiredCardClasses = [5,10] 
     case "Druid": 
     requiredCardClasses = [6,10] 
     case "Warlock": 
     requiredCardClasses = [7,10] 
     case "Mage": 
     requiredCardClasses = [8,10] 
     case "Priest": 
     requiredCardClasses = [9,10] 
     default: 
     requiredCardClasses = [10] 
    } 
    fetchRequest.sortDescriptors = [sortDescriptor] 
    fetchRequest.predicate = NSPredicate(format:"cardClass IN %@", requiredCardClasses) 

    return fetchRequest 

}