2016-10-25 4 views
0

Swift3でコード内にfetchedResultsControllerを使用したいと思います。私はthis wayと他の方法を試しましたが、私はそれを作ることができません。ここに私のコードはあります(それは動作しません):swift3でfetchedResultsControllerを使用する

var fetchedResultsController: NSFetchedResultsController<Entity> { 

    let fetchRequest: NSFetchRequest<Entity> 
    if #available(iOS 10.0, *) { 
     fetchRequest = Entity.fetchRequest() 
    } else { 
     // Fallback on earlier versions 
     fetchRequest = NSFetchRequest(entityName: "Entity") 
    } 

    fetchRequest.fetchBatchSize = 20 

    let orderDescriptor = NSSortDescriptor(key: "archiveOrder", ascending: true) 
    let nameDesctiptor = NSSortDescriptor(key: "entityName", ascending: false) 

    fetchRequest.sortDescriptors = [orderDescriptor, nameDesctiptor] 

    let aFetchedResultsController: NSFetchedResultsController<Entity> = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: appDelegate.managedObjectContext, sectionNameKeyPath: nil, cacheName: "Master") 
    aFetchedResultsController.delegate = self 
    _fetchedResultsController = aFetchedResultsController 

    do { 
     try _FetchedResultsController.performFetch() 
    } catch { 
     let nserror = error as NSError 
     print("Unresolved error \(nserror), \(nserror.userInfo)") 
    } 

    return _FetchedResultsController! 
} 

私に助言や提案をしてください。

+0

解決策が見つかりました。私は@nonobjc public class func fetchRequest() - > NSFetchRequest { NSFetchRequest(entityName: "Entity") }をMy Entityクラスに追加しました。 –

答えて

0

基本的にAppleはクロージャーでコードを一度だけ実行するクロージャーを使用して、非オプションの遅延初期化プロパティとしてNSFetchedResultsControllerを宣言することをお勧めします。

lazy var fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> { ... }() 

スウィフトコードが_fetchedResultsController_FetchedResultsControllerは、2つの異なるものですつまり、大文字と小文字が区別されますので、あなたのコードはコンパイルされません。

残りのコードは正しいようです。

lazy var fetchedResultsController: NSFetchedResultsController<Entity> { 

    let fetchRequest: NSFetchRequest<Entity> 
    if #available(iOS 10.0, *) { 
    fetchRequest = Entity.fetchRequest() 
    } else { 
    // Fallback on earlier versions 
    fetchRequest = NSFetchRequest(entityName: "Entity") 
    } 
    fetchRequest.fetchBatchSize = 20 

    let orderDescriptor = NSSortDescriptor(key: "archiveOrder", ascending: true) 
    let nameDesctiptor = NSSortDescriptor(key: "entityName", ascending: false) 

    fetchRequest.sortDescriptors = [orderDescriptor, nameDesctiptor] 

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, 
                managedObjectContext: appDelegate.managedObjectContext, 
                 sectionNameKeyPath: nil, 
                   cacheName: "Master") 
    aFetchedResultsController.delegate = self 

    do { 
    try aFetchedResultsController.performFetch() 
    } catch { 
    let nserror = error as NSError 
    print("Unresolved error \(nserror), \(nserror.userInfo)") 
    } 

    return aFetchedResultsController 
}() 
+0

私は 'lazy'を置くと、「lazyは計算されたプロパティで使用できないかもしれない」というエラーメッセージが表示されますので、削除しました。 –

+0

また、Xcodeの提案に従って、私はfetchRequest = Entity.fetchRequest()を! NSFetchRequest

+0

**計算されたプロパティではありません**。メソッドの最後に括弧のペアを考えてみましょう。 – vadian

関連する問題