fetchRequest.predicate with Coredata 在 Objective-C 上运行良好,但在 swift 上运行不佳

fetchRequest.predicate with Coredata runs fine with Objective-C but not with swift

我有两个在核心数据中有关系的实体:

实体 "Kategorien" 与称为 "kategorie"

的实体 "Details" 有关系 "To Many"

在 "Kategorien" 的控制器 A 中,我选择 "Kategorien" 并使用 "Details" 到达控制器 "DetailViewController":

Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "MainDetail" {
        let indexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()!
        let controller = segue.destinationViewController as DetailViewController
        let kat:Kategorien = self.fetchedResultsController.objectAtIndexPath(indexPath) as Kategorien

        controller.kategorie = kat        }
}

在 DetailViewController 中我收到它:

class DetailViewController: UITableViewController, NSFetchedResultsControllerDelegate {

    var kategoie:Kategorien!

In Objective-C kat 是 属性 in DetailViewController.h

@property (strong, nonatomic) Kategorien *kat;

在我刚才说的 fetchResulController 中

#pragma mark - Fetched results controllers delegates
- (NSFetchedResultsController *)fetchedResultsController {
...
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"kategorie == %@", kat];

并显示该类别的记录。

在 fetchResulController 中使用 Swift 我尝试使用

fetchRequest.predicate = NSPredicate(format:"kategorie == %@", kategorie)

和其他方式(即kategorie.description)但是

不会出现记录

我误会了什么?我的错误在哪里?它让我 发疯...

该构造函数在 swift 中不可用,因为它使用可变参数。

而不是 Objective C 构造函数:

+ (NSPredicate *)predicateWithFormat:(NSString *)format

使用swift构造函数:

init(format predicateFormat: String, 
     argumentArray arguments: [AnyObject]?) -> NSPredicate

因此您的代码应如下所示:

fetchRequest.predicate = NSPredicate(format:"kategorie == %@", argumentArray:[kategorie])

我明白了! :-) 从 Ray Wenderlichs "Core Data by Tutorials" 那里获取解决方案来管理 MOC:

import CoreData
public class CoreDataStack {  
  let context:NSManagedObjectContext
  let psc:NSPersistentStoreCoordinator
  let model:NSManagedObjectModel
  let store:NSPersistentStore?
  ...

此 class 由 AppDelegate.swift(无 MOC...)和 ViewController 调用。但这总是会创建一个新的 MOC!所以 "Kategorien" 和 "Details" 有自己的 MOC。 所以 fetchRequest

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"kategorie == %@", kategorie]

在 Details 中有另一个 MOC,因为 kategorien 从 controllerA 得到。

现在我杀死了 class CoreDataStack 并将其全部移植到 AppDelegate.swift 参见 。现在都使用相同的 MOC,一切都很好......:-)