2017-03-13 61 views
0

我是一名新的iOS开发人员。有没有办法将MKPlacemark实例保存到Realm中?

我想将MKPlacemark实例保存到Realm中,但我不知道如何保存它。要保存在Realm中,所有属性必须是基元,NSString,NSDate,NSData,NSNumber,RLMArray,RLMLinkingObjects或RLMObject的子类。

所以在这种情况下,我该如何将MKPlacemark转换为适当的属性?

回答

1

由于境界对象仅支持基本类型和引用到其他领域对象,你需要创建一个可以在MKPlacemark组件转化为境界,然后再返回的机制。

也许最清洁的方法是将有一个名为mkPlacemark公共变量(以下Objective-C对象的夫特3命名约定像cgImage :)属性)使得在设置或获取,将在内部执行转换。

class Placemark: Object { 
    dynamic var latitude = 0.0 
    dynamic var longitude = 0.0 
    dynamic var street: String? 
    dynamic var city: String? 
    dynamic var zipCode: String? 
    dynamic var country: String? 

    public var mkPlacemark: MKPlacemark { 
     set { 
     latitude = newValue.coordinate.latitude 
     longitude = newValue.coordinate.longitude 
     street = newValue.addressDictionary[kABPersonAddressStreetKey] 
     city = newValue.addressDictionary[kABPersonAddressCityKey] 
     zipCode = newValue.addressDictionary[kABPersonAddressZipCodeKey] 
     country = newValue.addressDictionary[kABPersonAddressCountryKey] 
     } 
     get { 
     let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
     let addressDictionary = [kABPersonAddressStreetKey: street, 
            kABPersonAddressCityKey: city, 
            kABPersonAddressZipCodeKey: zipCode, 
            kABPersonAddressCountryKey: country] 
     return MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary) 
     } 
    } 

    convinience init(placemark: MKPlacemark) { 
     super.init() 
     self.mkPlacemark = placemark 
    } 

} 

(我用手工写了这个代码,因此它可能需要一些调整,它实际上可以被编译之前。:))

+0

非常感谢。你的方法很棒,是的,它需要一些调整。所以我用工作代码添加了一个答案。 –

+1

我检查了这个答案,但所有的答案对我来说真的很有帮助:-) 谢谢大家! – chizcake

0

您可以创建自己的RLMObject,其中包含MKPlacemark属性。

class RLMPlacemark: Object { 
var coordinate: CLLocationCoordinate2D? 
var addressDictionary: [String: Any]? 

required convenience init?(placemark: MKPlacemark) { 
    self.init() 
    self.coordinate = placemark.coordinate 
    self.addressDictionary = placemark.addressDictionary as! [String : Any]? 
} 

}

+1

您不能直接在Realm中存储'CLLocationCoordinate2D'属性。你必须把它分成两个“双”(经度和纬度)。 – joern

0

这个答案是蒂姆的回答微调的版本。以下属性会发生变化:

RLMObject不能有MKPlacemark属性类型。所以mkPlacemark不能有set。它可以有get &它充当实例变量而不是存储属性。针对iOS 9+更新;使用新的联系人框架。 super.init()不得不改为self.init()

import Foundation 
import MapKit 
import RealmSwift 
import Contacts 

class RLMPlacemark: Object { 
    dynamic var latitude = 0.0 
    dynamic var longitude = 0.0 
    dynamic var street: String? 
    dynamic var city: String? 
    dynamic var state: String? 
    dynamic var zipCode: String? 
    dynamic var country: String? 
    dynamic var countryCode: String? 

    public var placemark: MKPlacemark { 
     get { 
      let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
      let addressDictionary = [CNPostalAddressStreetKey : street, 
            CNPostalAddressCityKey : city, 
            CNPostalAddressStateKey : state, 
            CNPostalAddressPostalCodeKey : zipCode, 
            CNPostalAddressCountryKey : country, 
            CNPostalAddressISOCountryCodeKey : countryCode] 
      let warningFreeAddressDictionary = (addressDictionary as Any) as? [String : Any] 
      return MKPlacemark(coordinate: coordinate, addressDictionary: warningFreeAddressDictionary) 
     } 
    } 

    convenience init(lat: Double, long: Double, street: String?, city: String?, state: String?, zipCode: String?, country: String?, countryCode:String?) { 
     self.init() 
     self.latitude = lat 
     self.longitude = long 
     self.street = street 
     self.city = city 
     self.state = state 
     self.zipCode = zipCode 
     self.country = country 
     self.countryCode = countryCode 
    } 

    convenience init(placemark: MKPlacemark) { 
     self.init(lat: placemark.coordinate.latitude, 
        long: placemark.coordinate.longitude, 
        street: placemark.addressDictionary?[CNPostalAddressStreetKey] as? String, 
        city: placemark.addressDictionary?[CNPostalAddressCityKey] as? String, 
        state: placemark.addressDictionary?[CNPostalAddressStateKey] as? String, 
        zipCode: placemark.addressDictionary?[CNPostalAddressPostalCodeKey] as? String, 
        country: placemark.addressDictionary?[CNPostalAddressCountryKey] as? String, 
        countryCode: placemark.addressDictionary?[CNPostalAddressISOCountryCodeKey] as? String) 
    } 
} 

这将是巨大的,如果这可以帮助任何人。 AddressDictionary的铸造是多余的。你可以直接使用它,但会抛出警告信息&我讨厌警告。 ;)

+0

领域可以有其他属性类型,只要它们被标记为忽​​略,在这种情况下,它们实际上不会持久存在于领域。在这种情况下,因为属性没有标记为动态的,所以Objective-C运行时不可见(因此它将被忽略)。通过这种方式,可以获得映射到Realm支持的数据的其他属性,但不会保存。 – TiM

相关问题