Разработка в IOS без использования глобальной переменной и класса - PullRequest
1 голос
/ 12 июля 2019

Я разрабатываю дополнительный модуль GPS для приложения в WinDev.WinDev поддерживает Swift-код, но только метод, исключающий использование классов и глобальных переменных.Вот что я сделал (в основном на основе Apple doc):

    import Foundation
    import CoreLocation
    import UIKit

    class mod_GPS : NSObject, CLLocationManagerDelegate {
        var distance = Double()
        var location_last : [CLLocation] = []
        let locationManager = CLLocationManager()

        func startReceivingLocationChanges() {
          // Do some stuff (basically what is write on doc)
        }

        internal func locationManager(_ manager: CLLocationManager,  didUpdateLocations locations: [CLLocation]) {
            let lastLocation = locations.last!
            if (location_last.count != 0){
                distance = distance + lastLocation.distance(from: location_last[0])
                location_last[0] = lastLocation
            }else{
                distance = 0
                location_last.append(lastLocation)
            }
        }

        func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
           //Same
        }

    }

Итак, у нас есть некоторый код для создания объекта и подсчета расстояния при перемещении пользователя.Но это не может иметь дело с WinDev.Проблема в следующем: «let locationManager = CLLocationManager ()», которые должны быть глобальными.Поэтому мне было интересно, есть ли способ избежать глобальной переменной.

Сначала я пытаюсь что-то вроде этого: часть быстрой записи на диск при каждом вызове LocationManage (didUpdateLocation) и часть в WinDev считывают значениекогда хотел.Но это не решает проблему, потому что мне все еще нужно инициировать переменную locationManager в части WinDev.Затем я думаю об анонимном классе, который существует в Java, но, кажется, отсутствует в быстром и объективном C.

Более того, сообщество разработчиков WinDev и документация полностью АФК, так что я не ожидал, что в этом поможет.Я явно не знаю, как сделать эту часть.Если у кого-то есть и идеи или советы ... Буду рад их услышать.

1 Ответ

1 голос
/ 12 июля 2019

Вы можете сделать что-то вроде этого:

override func viewDidLoad() {
    super.viewDidLoad()

    let locationManager = CLLocationManager()
    locationManager.delegate = self
    perform(#selector(hold), with: locationManager, afterDelay: 10000)
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    NSObject.cancelPreviousPerformRequests(withTarget: self)
}

@objc func hold(object: AnyObject) {
    perform(#selector(hold), with: object, afterDelay: 10000)
}

На что обратить внимание:

  • CLLocationManager делегат равен unowned, то есть он не будет установлен равным nil, когда контроллер представления будет освобожден, вы должны убедиться, что диспетчер местоположения будет освобожден до того, как контроллер представления сделает это, или ваше приложение будет сбой, если менеджер местоположения жил больше, чем его делегат (контроллер представления) и пытался получить к нему доступ.

  • Вы должны убедиться, что все объекты освобождены, когда вы закончите с ними, используя отладчик графа памяти или инструменты профилирования Xcode, иначе будут утечки памяти.

Выше код обрабатывает эти заметки, но вы должны проверить их, если вы внесли какие-либо изменения.

...