2016-06-26 10 views
15

AECoreDataUIからCoreDataTableViewController内のSwift 3を使用してiOS 10で自分のNSFetchedResultsControllerを初期化できません。iOS 10でNSFe​​tchedResultsControllerを初期化する方法Swift 3

let request = NSFetchRequest<NasaPicture>(entityName:"NasaPicture") 
request.predicate = Predicate(format: "isPagedResult == YES") 
request.sortDescriptors = [SortDescriptor(key: "date", ascending: false)] 
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) 

コンパイラは、コントローラが現在SWIFT用のジェネリック型を使用している

"Cannot convert value of type NSFetchedResultsController<NasaPicture> to expected type NSFetchedResultsController<_>" 

ことを不平を言っているが、それは正しくエンティティタイプを推測されていません。私は明示的に試しました:

fetchedResultsController = NSFetchedResultsController<NasaPicture>(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) 

ありがとうございます!

+0

これは変数宣言です。 'var fetchedResultsController:NSFetchedResultsController?'をもう使用することはできません。var fetchedResultsController:NSFetchedResultsController ? – Sulthan

答えて

24

NSFetchRequestは現在一般的です。 NSFetchedResultsControllerも一般的です。そのため、変数を宣言するとき、あなたは例えば、汎用的な宣言を使用する必要があります。

var fetchedResultsController: NSFetchedResultsController<NasaPicture>? 
+1

私のView Controllerには、frcを宣言するスーパークラスのCoreDataCollectionViewControllerがあります。再利用できるので、スーパークラスで宣言されているときにfrcを特定の型にバインドすることはできません。ベースクラスにジェネリック型パラメータを追加しない限りは? –

+1

これで問題は私の基底クラスにありました。タイプパラメータTを追加する必要がありました:NSFetchRequestResult、NSFetchRequestResultを使用していたどこででもTを使用し、サブクラスで使用するエンティティを提供するようにしました。 –

+2

@ JasonC.Howlin具体的にあなたがしたことを表示できますか?私は、述語、並べ替え記述子などを指定して、遅い時間をfrcとして宣言する時間があります。 – Adrian

-1

は単に関数を呼び出す:

private func setupFetchedResultsController() { 

    let context = NSManagedObjectContext.mr_default() 
    let fetchRequest = NSFetchRequest<Month>(entityName: "Month") 
    let dateDescriptor = NSSortDescriptor(key: "date", ascending: false) 

    fetchRequest.sortDescriptors = [dateDescriptor] 

    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "year", cacheName: nil) 
    fetchedResultsController.delegate = self 

    try! fetchedResultsController.performFetch() 
    tableView.reloadData() 
} 
0

我々は変数を宣言する必要がある場合、我々は一般的な宣言を使用する必要があります .. SWIFT 3にNSFetchedResultsControllerためのコードの下に

override func viewDidLoad() { 
    super.viewDidLoad() 
    do { 
     try self.fetchedResultsController.performFetch() 
    } catch { 
     let fetchError = error as NSError 
     print("Unable to Perform Fetch Request") 
     print("\(fetchError), \(fetchError.localizedDescription)") 
    } 

} // MARKを確認してください: - NSFetchedResultsController

fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExistenceOnXMPPCD> = { 
    let fetchRequest = NSFetchRequest<UserExistenceOnXMPPCD>(entityName: "UserExistenceOnXMPPCD") 
    fetchRequest.sortDescriptors = [ 
     NSSortDescriptor(key: "name", ascending: true)] 

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:CoreDataController.sharedInstance.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) 

    try! fetchedResultsController.performFetch() 
    fetchedResultsController.delegate = self 
    if let quotes = fetchedResultsController.fetchedObjects { 
     if quotes.count > 0 { 
      print(quotes.count) 
     } 
    } 
    return fetchedResultsController 
}() 


// MARK: - NSFetchedResultsController delegate methods 
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    tableView.beginUpdates() 
} 

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    tableView.reloadData() 
} 
関連する問題