我有一个属性" message" 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中正确设置自定义方法。
答案 0 :(得分:0)
在获取请求和SQLite支持的Core Data存储中使用自定义for Link_ID: L1, I want to grab and return the value: QEDED1SA and ignore AAAA|BBBB|CCCC/XX|YY|ZZ/
for Link_ID: L2, I want to grab the value: QWERTY
时,Core Data会尝试将表达式转换为SQL查询。这有助于提高性能,但这意味着并非所有有效NSExpression
都适用于核心数据。
具体而言,依赖于自定义函数的NSExpression
不能与Core Data fetch一起使用,因为Core Data无法将任意代码转换为SQL。
您需要从提取中删除此NSExpression
并使用提取结果转换为网址。您也可以切换到非SQLite核心数据存储,但由于各种原因,这通常会更糟糕,除非您的持久存储包含非常少量的数据。