Core Location、MapKit、Core Dataフレームワークを使用して、場所を保存し、後で地図上の場所を取得しようとしています。
私がやったことは、POIという名前のエンティティを作成し、緯度(ダブルタイプ)、経度(ダブルタイプ)などのプロパティを追加しただけです。
簡単に言えば、私のアプリは2つのNSNumbersでPOIを保存します。 (緯度と経度)しかし、それよりもCLLocationを格納するためのよりスマートな方法があるはずだと思います。
乾杯。
あなたがやっていることは結構です。緯度と経度は、コアデータに2倍として保存する必要があります。情報を再度取得する必要がある場合は、Core Dataからdoubleを取得し、CLLocationCoordinate2D
のような関数を使用してCLLocationCoordinate2DMake
構造体を構築します。場所を保存するための組み込みの方法はないため、緯度と経度のコンポーネントを保存するのが適切です。
緯度または経度で算術演算を行わない場合(境界ボックスを見つけるなど)、それらを文字列として保存できます。 floatとdoubleは値をわずかに変更する可能性があり、比較演算が失敗します。
CLLocationはNSCodingプロトコルを実装しているため、変換可能な属性としてコアデータに格納できます。デフォルトのNSKeyedUnarchiveFromData値トランスフォーマーを使用できます。
CCLocationオブジェクトを管理オブジェクト属性に渡すだけで、データにシリアル化され、SQLストアにBLOBとして保存されます。位置オブジェクトを戻す必要がある場合は、自動的にプロセスを逆にして、完全に入力されたCCLocationオブジェクトに戻ります。
それはあなたが望むものを得るための最も簡単な方法かもしれません。
それを保存する「最良の」方法は、それをどうしたいかによって異なります。
手動で行う場合に保存/復元できる追加のプロパティがたくさんあります(高度、水平精度、垂直精度、タイムスタンプ)。あなたができないこと(速度、見出し)がいくつかあります。 CLLocationは適切なinitメソッドを提供せず、プロパティは読み取り専用です。
追加のプロパティはすべて、トラックを録音する場合に役立ちます。標高は、山岳地帯でPOIを記録する場合に便利です(「100 m登る必要があります」)。水平/垂直精度は、POIの大きさを表すために使用される場合があります(たとえば、都市の「水平精度」は数kmで、大きな円として表示される場合があります)。
Core Data属性タイプをTransformable
に設定するだけで、これを非常に簡単に行うことができます。 Value Transformer Nameを空白のままにした場合のデフォルトのトランスフォーマーはNSKeyedArchiver
であり、NSURLやCLLocationなどのほとんどのFoundationタイプで機能します。
緯度と経度のポイントを格納するためにNSNumberを使用する必要はありません。代わりに、CLLocationをコアデータに直接保存できます。
CLLocationごとにエンティティを設定します。これは、ロケーションポイントを使用しているエンティティから離れた多すぎる関係になります。これをLocationPointと呼びましょう:
class LocationPoint: NSManagedObject {
@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var location: AnyObject
}
次に、locationプロパティをXcodeデータモデルで変換可能に設定します。それでおしまい!
Objective-cでは、実際にこのLocationPointプロパティをエラーなしでCLLocationとして宣言できます。
@property (nonatomic, strong) CLLocation *location
詳細はこちら 。