1

我在 CoreData Entity 中有一个 String 类型的属性“消息”,它存储文本,有时包括 URL。现在我需要从实体中获取所有 url。

    let predicate = NSPredicate(format:"message CONTAINS[cd] %@", "http")
    let fetchRequest = self.getfetchRequest(entityName: "Messages", sectionKey:nil, predicate:predicate)
    let expressionDescription = NSExpressionDescription()
    expressionDescription.name = "urlFromMsg"
    expressionDescription.expressionResultType = .StringAttributeType
    let expression = NSExpression(forFunction: "toUrl", arguments: [NSExpression(forKeyPath: "message")])

    expressionDescription.expression = expression
    fetchRequest.propertiesToFetch = [expressionDescription]
    fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType

这里的 toUrl 是一个扩展 String 的自定义函数。

extension String {
    func toUrl()->[String]?{
        let detector = try! NSDataDetector(types: NSTextCheckingType.Link.rawValue)
        let matches = detector.matchesInString(self, options: [], range: NSRange(location: 0, length: self.utf16.count))
        var urls = [String]()
        for match in matches {
            urls.append((self as NSString).substringWithRange(match.range))
        }
        return urls
    }
}

我在这条线上崩溃了

let expression = NSExpression(forFunction: "toUrl", arguments: [NSExpression(forKeyPath: "message")])

如何在 NSExpression 中正确设置自定义方法。

4

1 回答 1

1

NSExpression在 fetch 请求和 SQLite 支持的 Core Data 存储中使用自定义时,Core Data 会尝试将表达式转换为 SQL 查询。这有助于提高性能,但这意味着并非所有有效NSExpression的 s 都适用于 Core Data。

具体来说,NSExpression依赖于自定义函数的 an 不能与 Core Data fetch 一起使用,因为 Core Data 无法将任意代码转换为 SQL。

您需要NSExpression从 fetch 中删除它并使用 fetch 的结果转换为 URL。您也可以切换到非 SQLite Core Data 存储,但由于各种原因,这通常会更糟,除非您的持久存储包含非常少量的数据。

于 2016-08-12T16:25:32.207 回答