С CoreLocation.Foundation, добавен към BuildPhase и импортиран в горната част на файла, мога да получа информация за местоположението, ако поставя следното в контролер за изглед с бутон:
@IBAction func locationButton(sender: AnyObject) {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
Продължава към locationManager didUpdateLocations с CLGeocoder().reverseGeocodeLocation completionHandler, който показва информацията за местоположението в друга функция - това работи.
НО не работи, когато се опитвам да прехвърля същия този код в моя модел на данни. Настроих модела със следното:
import CoreLocation
class Record: NSObject, CLLocationManagerDelegate
{
let locationManager = CLLocationManager()
Тъй като няма бутон, поставих кода на LocationManager в:
override init()
{
iD = NSUUID().UUIDString
super.init()
if (CLLocationManager.locationServicesEnabled())
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestWhenInUseAuthorization()
switch CLLocationManager.authorizationStatus() {
case .AuthorizedWhenInUse, .AuthorizedAlways:
locationManager.startUpdatingLocation()
case .NotDetermined:
locationManager.requestWhenInUseAuthorization() // or request always if you need it
case .Restricted, .Denied:
print("tell users that they need to enable access in settings")
default:
break
}
print("Location services available")
if CLLocationManager.authorizationStatus() == .NotDetermined
{
print("Still Not Determined")
}
} else { print("Location services not available") }
}
Получавам „Налични услуги за местоположение“. Но следният код никога не отпечатва нищо в конзолата, нито извиква функцията toSetLocationStamped.
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!)
{
print("started location man")
CLGeocoder().reverseGeocodeLocation(manager.location, completionHandler: //pass the location co-ordinates
{
(placemarks, error) -> Void in
if (error != nil)
{
println("Reverse geocoder failed with error" + error.localizedDescription)
return
}
if placemarks.count > 0 //process the location array (placemarks)
{
let pm = placemarks[0] as! CLPlacemark
self.toSetLocationStamped(pm)
print("got here")
} else
{
println("Problem receiving data from geocoder")
}
})
}
Ако поставя deinit на класа Record, с прост журнал за печат, няма изход.
deinit
{
print("deinit")
}
Инициализирам dummyRecord: Запис от необходим init в клас MasterViewController:
class MasterViewController: UITableViewController
{
var records = [Record]()
var subjectDescription: String?
// weak var delegate: MonsterSelectionDelegate? // property for object conforming to MSDelegate
required init(coder aDecoder: NSCoder) // // coder because class is loaded from Storyboard
{
super.init(coder: aDecoder)
var dummyRecord1 = Record()
dummyRecord1.details = "All was very good and strong with a little bit of lemon on the side of the hill."
dummyRecord1.dateTimeEntered = NSDate(dateString: "2015-07-22")
dummyRecord1.subject = "Clouds"
dummyRecord1.locationEntered = "Drittelsgasse 1, 69493 Großsachsen, Germany."
dummyRecord1.photos.append(UIImage(named: "zombies.jpg")!)
records.append(dummyRecord1)
}
deinit
, който регистрира, когато този обект бъде освободен, за да сте сигурни, че няма да бъде освободен, преди да е извършено асинхронното извикване. - person Rob   schedule 18.08.2015NSLocationWhenInUseUsageDescription
вInfo.plist
. Може да предложа да проверитеauthorizationStatus
на мениджъра на местоположението и да внедритеdidChangeAuthorizationStatus
и да видите дали виждате, че се оторизира. Не е свързано, но ми се струва неефективно всеки запис да има свой собственCLLocationManager
. Изглежда, че това не трябва да присъства в модела, още по-малко на рекордното ниво. - person Rob   schedule 19.08.2015authorizationStatus
, има само четири възможни стойности, така че добавете изразif
/switch
, за да видите коя е тя. RelocationServicesEnabled
, да, трябва да го направите, но това е съвсем различен въпрос (напр. това устройство с GPS възможности ли е). Трябва да проверитеauthorizationStatus
, за да видите дали потребителят е дал разрешение. Отново мениджър на местоположения в записа, това е вашето решение, но това е архитектурно грешното място. Плюс това, ако наистина не е масив, тогава не го правете масив. И ако е масив, поставянето на диспечера на местоположението там е определено грешното място. - person Rob   schedule 20.08.2015