2016-08-12 10 views
0

CoreData Entityに文字列の属性 "message"があります。これはテキストを格納し、場合によってはURLを含みます。今私はエンティティからすべてのURLを取得する必要があります。NSExpressionを使用してカスタム関数でNSFe​​tchRequest propertiesToFetchを設定する方法

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 
    } 
} 

私はNSExpressionで適切にカスタムメソッドを設定する方法

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

この行でクラッシュを取得しています。

+0

http://useyourloaf.com/blog/core-data-queries-using-expressions/を参照してください。ただし、すべてのカスタム機能がCD互換です。 –

答えて

0

フェッチ要求とSQLiteでサポートされるコアデータストアでカスタムNSExpressionを使用すると、コアデータは式をSQLクエリに変換しようとします。これはパフォーマンスに役立ちますが、すべての有効なNSExpressionがCore Dataで使用できるわけではありません。

具体的には、コアデータは任意のコードをSQLに変換できないため、カスタム関数に依存するNSExpressionは、コアデータフェッチでは使用できません。

フェッチ結果からこのNSExpressionをフェッチしてURLに変換する必要があります。また、SQLite以外のコアデータストアに切り替えることもできますが、パーシステントストアには非常に少量のデータが含まれていない限り、一般的にさまざまな理由でさらに悪化します。

関連する問題