[英]How can I sort by a transformable attribute in an NSFetchedResultsController?
[英]How can I use a Transformable attribute as its actual type in a NSManagedObject subclass?
剛剛開始一個項目。 數據模型文件具有一個實體,該實體具有可轉換的單個屬性。 應該是NS/CGRect
。 我讓Xcode創建了相應的NSManagedObject
子類文件。 對於“ MyThing.swift”,我得到了:
import Foundation
import CoreData
class MyThing: NSManagedObject {
// Insert code here to add functionality to your managed object subclass
}
我得到了“ MyThing + CoreDataProperties.swift”:
import Foundation
import CoreData
extension MyThing {
@NSManaged var myBounds: NSObject?
}
我希望該屬性成為實際的CGRect
,因此我需要一個NSData <-> NSValue <-> NSRect
轉換鏈。 我已經在接口構建器中的“屬性類型”下將“ NSKeyedUnarchiveFromDataTransformer”作為名稱。 我要添加(和/或更改)什么來傳遞CGRect
值?
還是我不這樣做,而是通過NSValue
包裝的CGRect
代替? (我希望CoreData能夠處理所有NSData <-> NSValue
轉換。)
因為CGRect不是類而是struct,所以我建議創建另一個屬性,該屬性將通過適當的轉換訪問原始變量。 然后僅使用該屬性。
class MyThing {
var boundsValue : NSValue?
}
extension MyThing {
var bounds : CGRect {
get {
if let value = boundsValue {
value.CGRectValue()
}
return CGRectNull
}
set {
boundsValue = NSValue(CGRect: newValue)
}
}
}
只要您的可轉換類型符合NSCoding,Core Data就會為您處理其余的工作。 我在NSManagedObjects
使用了NSAttributedString
,僅更改了CoreData提供的在運行時生成的id
-type。
如果要擁有自己的類型的屬性,即MyAwesomeObject
,請確保實現initWithCoder:
和encodeWithCoder:
因此,對於您的情況,為了將CGRects
與CoreData存儲在一起,您需要將它們包裝在實現上述方法的類中。 這是因為CGRect不符合NSCoding協議,因此不能直接存儲為可轉換屬性。
當然,您的另一個選擇是將x
, y
, width
, height
作為屬性存儲,並且具有在awakeFromFetch
和awakeFromInsert
計算的過渡屬性,或者只是一種便捷方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.