获取实体NSSet的最后一条记录?

时间:2017-04-08 04:01:21

标签: swift core-data

我有Pet个可以拥有多个事件的实体:

public class Pet: NSManagedObject { 
    @NSManaged var dbName: String
    @NSManaged var events: NSSet?    // 1-to-many relationship with events
}

public class Event: NSManagedObject {
    @NSManaged var key: String
    @NSManaged var date: Int64
}

我已根据日期设置要编制索引的事件。我做了一个函数,返回给定宠物的所有事件。

func fetchEventsForPet(pet: String) -> [Event]? {
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: Pet.entityName)
    let predicate = NSPredicate(format: "dbName == %@", pet)
    request.predicate = predicate
    request.fetchLimit = 1
    do {
        let result = try self.fetch(request) as? [Pet]
        if let pets = result {
            for pet in pets {
                if let events = pet.events {
                    if let evts = events.allObjects as? [Event] {
                        return evts                      // Return pets events
                    }
                }
            }
        }
    } catch {}
    return nil
}

如何修改此函数以仅返回最后一个事件(基于date的最新事件)?我是否每次都要获取所有事件,或者有更快的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

您的实体类定义意味着您没有从Event到Pet的反向关系。你应该创建一个(很少有这样的场合你没有逆转就会更好)。然后,您可以直接获取事件,而不是获取Pets并使用events关系。假设您将反向关系命名为“pet”,您将使用如下谓词:

  let predicate = NSPredicate(format: "pet.dbName == %@", pet)

然后,您可以应用排序描述符和获取限制,以仅返回给定宠物名称的最新事件。