2014-06-11 37 views
1

無法弄清楚如何重寫以下方法swift 爲了更好的學習曲線,所以我試着翻譯這段代碼。所以讓我們選擇一個更困難的方法來做到這一點。它有error handlingobject initparameter settings,一個array of object pointersselectorsnil,並self ..如何NSFetchedResultsController編碼在Swift

的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; 
} 

專門無法弄清楚如何調用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 
} 

回答

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 

這看起來像是線到線翻譯,我希望它有幫助。

+0

地獄啊。這工作。 –

+2

我不明白,是不是應該用Swift刪除實例變量?這兩個變量是如何處理的?這方面最後一行的含義是什麼? –

+0

最後一行確實就像一個實例變量。奇怪的是,如果您查看AppDelegate.swift文件中的Core Data代碼模板,則可以看到Apple在多個位置使用相同的技術,即_instanceVariable。 – iMaddin

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 
}() 
相關問題