2015-09-04 75 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 

}