2016-06-26 48 views
15

AECoreDataUI'dan CoreDataTableViewController içinde Swift 3'ü kullanarak iOS 10'da başlatılan NSFetchedResultsController'umu başlatamıyorum.iOS'ta bir NSFetchedResultsController nasıl başlatılır 10 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) 

Derleyici kontrolör artık hızlı jenerik türü kullanıyor

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

şikayetçi olduğu, ancak doğru varlık türünü çıkarım değildir. Açıkça denedim:

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

Ayrıca hayır şans.

Teşekkürler!

+0

değişken bildiriminiz. 'Var fetchedResultsController: NSFetchedResultsController?' Artık kullanamazsınız, var varvaredResultsController: NSFetchedResultsController? – Sulthan

cevap

24

NSFetchRequest artık genel bir modeldir. NSFetchedResultsController da bir jeneriktir. değişkenleri bildirirken nedenle, genel bir deklarasyon kullanmak zorunda, mesela: Biz değişken bildirmek gerektiğinde o zaman genel bir deklarasyon kullanmak zorunda,

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() 
} 
+1

Kullanmak zorundayım. Görünüm denetleyicim, frc'yi bildiren bir süper sınıf CoreDataCollectionViewController'a sahiptir. Yeniden kullanılabildiğinden, üst sınıfta bildirildiğinde frc'yi belirli bir türe bağlayamıyorum. Temel sınıfta genel bir tür parametresi eklemediğim sürece? –

+1

Tamam, sorun benim temel sınıfımdaydı - T: NSFetchRequestResult türünde bir parametre ekledim, NSFetchRequestResult kullandığım her yerde T'yi kullanmalı ve alt sınıflar, kullanmak istedikleri Varlığı Sağladıkları var. –

+2

@ JasonC.Howlin Ne yaptığını gösterebilir misin? Ben bir tembel, sıralama tanımlayıcıları, vb belirterek, bir tembel tembel bildiren bir ayı ayıyorum. – Adrian

-1

Basitçe işlevi çağırmak .. hızlı 3'te NSFetchedResultsController için kodunun altına

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 kontrol edin: - 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() 
} 
0

:

var fetchedResultsController: NSFetchedResultsController<NasaPicture>?