【问题标题】:Search through an array of NSManagedObject搜索 NSManagedObject 数组
【发布时间】:2018-08-31 12:59:01
【问题描述】:

我有一个 NSManagedObjects 数组。我想使用搜索栏搜索整个数组。但问题在于NSManagedObject 的数组中有不同类型的键(不同的实体)。就像我使用标题搜索一样,会有如下键:

event_title

message_title

album_title

现在如何从数组中的所有这些字段中搜索关键字?

【问题讨论】:

  • 在同一个数组中有不同的实体类型是不常见的,但是如果你使用 Core Data,你通常不会搜索数组。您将使用 NSPredicate 从 Core Data 存储中获取匹配的对象。

标签: ios objective-c core-data nspredicate nsmanagedobject


【解决方案1】:

假设Event 是你的NSManagedObject

var events = [Event]()

var event1 = Event()
event1.event_title = "Musical Bang"
event1.message_title = "Wellcome to all"
event1.album_title = "Bang bang"


var event2 = Event()
event2.event_title = "Mountain View"
event2.message_title = "Free passes available"
event2.album_title = "Hunt for freedom"


events.append(event1)
events.append(event2)


func search(for searchText: String) -> Any{
    let filtered = events.filter { (value) -> Bool in
        return value.event_title.hasPrefix(searchText) || value.message_title.hasPrefix(searchText) || value.album_title.hasPrefix(searchText)
    }
    return filtered
}

【讨论】:

  • @JoakimDanielson 有时您永远不会得到确切的答案,您也必须自己思考。无论如何,我已经根据所问的问题更改了答案
  • 你还是不明白。该数组包含不同类型的对象,您假设它们属于同一类型,因此您的答案根本没有帮助。
  • 是的,我理解了这个问题,但是,在这里你和我应该理解的另一件事是另一个托管对象有不同的键,因此为了执行特定的搜索条件,我们必须指定确切的搜索功能内的关键路径。即 value.event_title.{key}.{key}.hasPrefix(searchText)。所以我应该知道给出确切解决方案的关键路径。
  • 所以你的意思是如果数组包含 3 种类型的对象,那么每次搜索必须使用不同的键路径执行 3 次搜索?
  • 是的,假设您将事件作为主要对象,并且在内部有子对象,因此您必须对所有对象应用过滤器
【解决方案2】:

您可以创建一个带有搜索属性的协议,然后让所有 NSManagedObject 子类实现该协议,返回要搜索的任何字段。这当然要求它们都是相同的类型或者可以转换为相同的类型

protocol SearchableKey {
   var searchKey: String
}

class Event: NSManagedObject, SearchableKey {
   var searchKey: String {
      return someFieldInEvent
   }
}

然后您将搜索栏设置为在 searchKey 上搜索

编辑:我现在看到这是用objective-c标记的,我的答案是使用swift,但希望它无论如何都会有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2012-09-16
    • 2011-09-12
    • 2015-07-02
    相关资源
    最近更新 更多