为 NSFetchedResultsController 设置 NSPredicate

Posted

技术标签:

【中文标题】为 NSFetchedResultsController 设置 NSPredicate【英文标题】:Setting NSPredicate for NSFetchedResultsController 【发布时间】:2016-02-13 19:34:16 【问题描述】:

我在地图上有一个图钉列表。每个图钉都附有一张照片列表。

这里是 Pin 类

class Pin: NSManagedObject, MKAnnotation 

@NSManaged var id: NSNumber
@NSManaged var latitude: NSNumber
@NSManaged var longitude: NSNumber
@NSManaged var album: [Photo]
@NSManaged var totalPagesCount: NSNumber?

lazy var coordinate: CLLocationCoordinate2D = 
    return CLLocationCoordinate2D(latitude: self.latitude as Double, longitude: self.longitude as Double)
()

init(latitude: Double, longitude: Double, context: NSManagedObjectContext) 
    let entity =  NSEntityDescription.entityForName("Pin", inManagedObjectContext: context)!
    super.init(entity: entity,insertIntoManagedObjectContext: context)
    self.id = NSDate().timeIntervalSince1970
    self.latitude = latitude
    self.longitude = longitude


override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 
    super.init(entity: entity, insertIntoManagedObjectContext: context)


这是 Photo 类:

class Photo: NSManagedObject 

@NSManaged var id: String
@NSManaged var path: String?
@NSManaged var url: String
@NSManaged var pin: Pin

init(photoResponse: PhotoResponse, context: NSManagedObjectContext) 
    let entity =  NSEntityDescription.entityForName("Photo", inManagedObjectContext: context)!
    super.init(entity: entity, insertIntoManagedObjectContext: context)
    self.id = photoResponse.id
    self.url = photoResponse.url


override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 
    super.init(entity: entity, insertIntoManagedObjectContext: context)


func deletePhotoFile() 
    if let path = path 
        let filemgr = NSFileManager.defaultManager()
        do 
            try filemgr.removeItemAtPath(path)
         catch 
    


当我点击一个图钉时,会出现一个新的视图控制器,下载并显示照片。

为此,视图控制器有一个懒惰的NSFetchedResultsController

lazy var fetchedPhotosController: NSFetchedResultsController = 
    let fetchRequest = NSFetchRequest(entityName: "Photo")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]
    fetchRequest.predicate = NSPredicate(format: "pin.id = %s", self.pin.id)
    let fetchedResultsController = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: DataManager.getInstance().coreDataStackManager.managedObjectContext,
        sectionNameKeyPath: nil,
        cacheName: nil
    )
    return fetchedResultsController
()

如果我删除谓词行,一切看起来都很好,除了我收到 NSFetchedResultsControllerDelegate 中的所有照片,而不仅仅是那些属于点击的 pin 的照片。

如果我改为设置谓词,我将无法在NSFetchedResultsControllerDelegate 中获得任何更新。

为什么?我认为在为每张照片关联的 pin 的 ID 设置约束时有问题,但我无法弄清楚。

【问题讨论】:

【参考方案1】:

将谓词更改为:

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

因为您可以直接与对象进行比较,而不是尝试深入研究这些对象。此外,虽然 %s 是一个有效的格式说明符,但它不适合与 NSString 变量一起使用。

【讨论】:

以上是关于为 NSFetchedResultsController 设置 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController - 用户驱动的更改

将 A 转换为 1 B 转换为 2 ... Z 转换为 26,然后将 AA 转换为 27 AB 转换为 28(Excel 中列引用的列索引)

考试错题

SQL判断字段是不是为空,为NULL

2021-11-26:() 分值为2, (()) 分值为3, ((())) 分值为4, 也就是说,每包裹一层,分数就是里面的分值+1。 ()() 分值为2 * 2, (())() 分值为3 * 2。(

java怎么判断对象为null