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,一切都很好......:-)
我有两个在核心数据中有关系的实体:
实体 "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 参见