如何在Swift中编写NSFetchedResultsController

Ol *_*Sen 1 objective-c swift xcode6

无法弄清楚如何在swift中重写以下方法以 获得更好的学习曲线,所以我试图翻译这段代码.所以让我们选择一个更难的方法来做到这一点.它有error handling,object init并且parameter settings,一array of object pointers,selectors,nil,和self..

Objective-C的:

-(NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *frC = [[NSFetchedResultsController alloc]
        initWithFetchRequest:fetchRequest
        managedObjectContext:self.managedObjectContext 
        sectionNameKeyPath:nil 
        cacheName:@"Master"];
    frC.delegate = self;
    self.fetchedResultsController = frC;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)

特别想不通怎么打电话NSEntityDescription *entity.在解释规格时我无法重写这个正确的..

迅速:

var fetchedResultsController: NSFetchedResultsController {

    var _fetchedResultsController: NSFetchedResultsController? = nil  //??

    var fetchRequest: NSFetchRequest? = nil  // ??
    var entity: NSEntityDescription = NSEntityDescription( /*. . .*/ ) //??

    fetchRequest.entity(entity) //?? sure this is wrong

    ...

    return _fetchedResultsController
}
Run Code Online (Sandbox Code Playgroud)

小智 6

这看起来就像使用CoreData设置主 - 详细信息项目时获得的代码.

你可以在Xcode 6中做同样的事情,但选择Swift作为语言.在MasterViewController中,您将获得:

var fetchedResultsController: NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }

    let fetchRequest = NSFetchRequest()
    // Edit the entity name as appropriate.
    let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: self.managedObjectContext)
    fetchRequest.entity = entity

    // Set the batch size to a suitable number.
    fetchRequest.fetchBatchSize = 20

    // Edit the sort key as appropriate.
    let sortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
    let sortDescriptors = [sortDescriptor]

    fetchRequest.sortDescriptors = [sortDescriptor]

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: "Master")
    aFetchedResultsController.delegate = self
    _fetchedResultsController = aFetchedResultsController

    var error: NSError? = nil
    if !_fetchedResultsController!.performFetch(&error) {
         // Replace this implementation with code to handle the error appropriately.
         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         //println("Unresolved error \(error), \(error.userInfo)")
         abort()
    }

    return _fetchedResultsController!
}    
var _fetchedResultsController: NSFetchedResultsController? = nil
Run Code Online (Sandbox Code Playgroud)

这看起来像一个行到线的翻译,我希望它有所帮助.

  • 我不明白,我们不应该用Swift删除实例变量吗?这两个变量是如何处理的?在这种情况下最后一行的含义是什么? (2认同)

小智 5

试试懒惰:

lazy var fetchedResultsController: NSFetchedResultsController = {
    let fetchRequest = NSFetchRequest()
    // Edit the entity name as appropriate.
    let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: self.managedObjectContext())
    fetchRequest.entity = entity

    // Set the batch size to a suitable number.
    fetchRequest.fetchBatchSize = 20

    // Edit the sort key as appropriate.
    let sortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
    let sortDescriptors = [sortDescriptor]

    fetchRequest.sortDescriptors = [sortDescriptor]

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext(), sectionNameKeyPath: nil, cacheName: "Master")
    aFetchedResultsController.delegate = self

    var error: NSError? = nil
    if !aFetchedResultsController.performFetch(&error) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        //println("Unresolved error \(error), \(error.userInfo)")
        abort()
    }

    return aFetchedResultsController
}()
Run Code Online (Sandbox Code Playgroud)