2016-10-22 22 views
8

Bất kỳ trợ giúp nào được đánh giá cao.Swift 3 - NSFetchRequest Các kết quả riêng biệt

Xcode tự động cập nhật để 8 ... Tôi Nhắm mục tiêu IOS 9,3

Có tất cả các mã chuyển đổi trên nhưng có một điều hiện đang phá vỡ, tôi đã cố gắng gợi ý khác nhau trong câu hỏi tương tự! Yêu cầu tìm nạp của tôi rằng trước đó hiện đang hoạt động.

Mục tiêu của tôi là nhận danh sách riêng biệt. Các tai nạn ứng dụng trên dòng:

let results = try context.fetch(fetchRequest) 

Với các lỗi được mô tả trong giao diện điều khiển như:

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

Dưới đây là chức năng

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) 
      } 
} 

Nếu dòng dưới đây được giấu nó doesn' t phá vỡ, nhưng sau đó tôi không nhận được những gì tôi muốn!

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

Tôi hiểu rằng tôi có thể sử dụng tất cả các kết quả (4300) và lặp lại chúng như một bản sửa lỗi, nhưng điều này không đúng cách để sửa lỗi này, đặc biệt là cách hoạt động trước đó!

+0

cùng một vấn đề. Bạn đã giải quyết nó? –

+0

Tương tự ở đây:/Có tin gì không? Tôi cũng tạm thời giải quyết nó bằng cách lặp qua các kết quả không phân biệt và bỏ qua các bản sao. – datayeah

+0

Cùng một vấn đề ... tôi sẽ làm những gì @datayeah đang làm cho thời gian được, nhưng nếu không không thể tìm thấy bất kỳ giải pháp này từ phía SQL được nêu ra. –

Trả lời

7

Bí quyết là để làm cho chung tổng quát hơn - thay vì <BodyType> trong yêu cầu lấy của bạn, sử dụng <NSFetchRequestResult>:

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

Kết quả của việc lấy yêu cầu này là [Any], vì vậy bạn sẽ cần phải cast cho phù hợp loại từ điển trước khi sử dụng. Ví dụ:

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) 
    } 
} 

Lưu ý: NSFetchRequestResult là một giao thức, được thông qua bởi bốn loại:
- NSDictionary,
- NSManagedObject,
- NSManagedObjectID, và
- NSNumber

Thông thường, chúng tôi sử dụng nó với NSManagedObject, chẳng hạn như BodyType của bạn. Trong trường hợp này, tuy nhiên, bạn sẽ nhận được các loại từ điển vì tuyên bố:

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 
+0

Đã lưu ngày của tôi. Cảm ơn :) – 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

Hãy giải thích mã này. – RamenChef

Các vấn đề liên quan