var myGroup = DispatchGroup()
class Place: NSObject, NSCoding {
// Properties
var placeCoordinate: CLLocation!
var placeName: String!
// Methods
required init(coder aDecoder: NSCoder) {
self.placeCoordinate = aDecoder.decodeObject(forKey: "placeCoordinate") as! CLLocation
self.placeName = aDecoder.decodeObject(forKey: "placeName") as! String
}
init(latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
myGroup.enter()
self.placeCoordinate = CLLocation(latitude: latitude, longitude: longitude)
CLGeocoder().reverseGeocodeLocation(self.placeCoordinate, completionHandler: { (placemarks, error) -> Void in
if error != nil {
self.placeName = "Unrecognized"
print(error!)
} else {
if let placemark = placemarks?[0] {
self.placeName = (placemark.addressDictionary!["FormattedAddressLines"] as! [String])[1]
myGroup.leave()
}
}
})
}
func encode(with aCoder: NSCoder) {
aCoder.encode(placeCoordinate, forKey: "placeCoordinate")
aCoder.encode(placeName, forKey: "placeName")
}
}
我已经构建了这个使用async
函数的类,如您所见。
我想在UserDefaults
保存此对象的数组。我发现在UserDefaults上保存自定义对象是不可能的,所以现在我正在尝试使用NSCoding
。
在上面的代码中我得到错误:
在所有成员初始化之前由闭包捕获的自我
在reverseGeocodeLocation
函数行的构造函数中。
在添加NSCoding
部分之前,需要提及以下代码。
答案 0 :(得分:0)
在[weak self]
中使用capture list
closure
作为:
CLGeocoder().reverseGeocodeLocation(self.placeCoordinate, completionHandler: {[weak self] (placemarks, error) -> Void in
//...
})