コアデータ(iPhone)を使用してクロケーションを保存する方法は?
-
05-10-2019 - |
質問
場所を保存し、コアロケーション、MapKit、およびコアデータフレームワークを使用して、地図上の場所を取得しようとしています。
私がやったことは、私がちょうどPOIという名前のエンティティを作成し、緯度(二重タイプ)、経度(二重タイプ)などのプロパティを追加したことです。
簡単に言えば、私のアプリは2つのnsnumbersでPOIを保存します。 (Lat and Long)しかし、私はそれよりもclocationを保存するためのより賢い方法がなければならないと感じています。
乾杯。
解決
あなたがしていることは大丈夫です。コアデータの倍率と経度を2倍にする必要があります。もう一度情報を取得する必要がある場合は、コアデータからダブルスを取り戻し、 CLLocationCoordinate2D
のような関数を持つstruct CLLocationCoordinate2DMake
. 。場所を保管する方法は組み込まれていないため、緯度と経度のコンポーネントを保管することは問題ありません。
緯度や経度で数学の操作を行っていない場合(境界ボックスなど)、文字列として保存できます。フロートとダブルスは、値をわずかに変更し、比較操作を失敗させる可能性があります。
他のヒント
CllocationはNSCODINGプロトコルを実装しているため、Transformable属性としてコアデータに保存できます。デフォルトのnskeyedunarchivefromdata値トランスを使用できます。
cclocationオブジェクトを管理したオブジェクト属性に渡すだけで、データにシリアル化し、SQLストアにBlobとして保存します。ロケーションオブジェクトをバックバックする必要がある場合、プロセスを自動的に逆転させ、完全に人口の多いcclocationオブジェクトを返します。
それはあなたが望むものを手に入れる最も簡単な方法かもしれません。
それを保存する「最良の」方法は、あなたがそれで何をしたいかによって異なります:
- 「同じ」cllocationが必要な場合は、シリアル化してください。 nskeyedunarchivefromdataは大丈夫です。
- 緯度と経度で検索するだけの場合は、それらをダブルとして保存します(「インデックス付き」チェックボックスを確認してください)。
手動で行うと、保存/復元できる追加のプロパティがたくさんあります(高度、水平障害、垂直、タイムスタンプ)。あなたができないことがいくつかあります(スピード、見出し)。 Cllocationは適切なinit-methodを提供しず、プロパティは読み取られます。
トラックを録音している場合は、すべての追加プロパティが便利です。高度は、山岳地帯でPOIを記録している場合に役立ちます(「まだ100 mを登らなければならない」)。水平/垂直精度は、POIの大きさを表すために使用される場合があります(たとえば、都市は数kmの「水平精度」を持ち、大きな円として表示される可能性があります)。
コアデータ属性タイプをに設定するだけで、これを非常に簡単に行うことができます Transformable
. 。あなたが離れる場合のデフォルトの変圧器 値トランス名 空白は NSKeyedArchiver
NSURLやCllocationなどのほとんどのファンデーションタイプで動作します。
NSNumberを使用して緯度と経度のポイントを保存する必要はありません。代わりに、Cllocationをコアデータに直接保存できます。
各クロケーションのエンティティをセットアップすると、ロケーションポイントを使用しているエンティティがあらゆるものの多くの関係になります。この位置ポイントと呼びましょう。
class LocationPoint: NSManagedObject {
@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var location: AnyObject
}
次に、を設定します 位置 Xcodeデータモデルで変換できるプロパティ。それでおしまい!
Objective-Cでは、実際にこのLocationPointプロパティをエラーなしでCllocationとして宣言できます。
@property (nonatomic, strong) CLLocation *location