2016-10-22 2 views
8

Любая помощь оценена.Swift 3 - NSFetchRequest Отдельные результаты

Xcode автоматически обновляется до 8 ... Я Таргетинг IOS 9,3

Есть весь код преобразуется через но одна вещь, теперь ломать, я пробовал различные предложения в подобных вопросах! Мой запрос на выбор, который был ранее работающий сейчас ломается.

Моя цель - получить отчетливый список. В приложение падает на линии:

let results = try context.fetch(fetchRequest) 

с ошибкой, описанной в консоли как:

Could not cast value of type 'NSKnownKeysDictionary1' (0x10fd29328) to 'MyApp.BodyType' (0x10eebc820). 

Здесь функция

func getBodyTypes() { 
      let context = ad.managedObjectContext 
      let fetchRequest = NSFetchRequest<BodyType>(entityName: "BodyType") 
      fetchRequest.propertiesToFetch = ["name"] 
      fetchRequest.returnsDistinctResults = true 
      fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

      do { 
       let results = try context.fetch(fetchRequest) 

       for r in results { 
        bodyTypes.append(r.value(forKey: "name") as! String) 
       } 
      } catch let err as NSError { 
       print(err.debugDescription) 
      } 
} 

Если ниже линии скрыта Безразлично» t break, но тогда я не получаю то, что хочу!

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

Я понимаю, я мог бы использовать все результаты (4300) и петли через них, как бинт исправить, но это не похоже на правильный путь, чтобы исправить это, прежде всего, как это работает, прежде чем!

+0

та же проблема. Вы решили это? –

+0

То же самое:/Любые новости? Я также временно решил его путем итерации через нечеткие результаты и игнорирования дубликатов. – datayeah

+0

Same issue ... Я собираюсь сделать то, что @datayeah делает на время, но в противном случае не может найти какое-либо решение для этого со стороны SQL. –

ответ

7

Хитрость заключается в том, чтобы сделать общую более общим - вместо <BodyType> в запросе выборки, используйте <NSFetchRequestResult>:

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BodyType") 

Результат этого запроса выборки является [Any], так что вам нужно будет подавать в соответствующем тип словаря перед использованием. Например:

func getBodyTypes() { 
    let context = ad.managedObjectContext 
    // 1) use the more general type, NSFetchRequestResult, here: 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BodyType") 
    fetchRequest.propertiesToFetch = ["name"] 
    fetchRequest.returnsDistinctResults = true 
    fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

    do { 
     let results = try context.fetch(fetchRequest) 

     // 2) cast the results to the expected dictionary type: 
     let resultsDict = results as! [[String: String]] 

     for r in resultsDict { 
      bodyTypes.append(r["name"]) 
     } 

    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
} 

Примечание: NSFetchRequestResult представляет собой протокол, принятый четыре типа:
- NSDictionary,
- NSManagedObject,
- NSManagedObjectID и
- NSNumber

Как правило, мы используя его с NSManagedObject, например BodyType. В этом случае, однако, вы получаете словарь типа из-за заявления:

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 
+0

Сохранял мой день. Спасибо :) – Ali

-1
 let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: 
    "BodyType") 
    fetchRequest.propertiesToFetch = ["name"] 
    fetchRequest.returnsDistinctResults = true 
    fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

    do { 
     let results = try context.fetch(fetchRequest) 

     for r in results { 
      let p = (r as AnyObject).value(forKey: "name") as! String 
      print(p) 
     } 


    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
+1

Объясните этот код, пожалуйста. – RamenChef

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