【发布时间】: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 设置约束时有问题,但我无法弄清楚。
【问题讨论】: