为 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 中列引用的列索引)
2021-11-26:() 分值为2, (()) 分值为3, ((())) 分值为4, 也就是说,每包裹一层,分数就是里面的分值+1。 ()() 分值为2 * 2, (())() 分值为3 * 2。(