在IOS中进行开发,而无需使用全局变量和类

时间:2019-07-11 21:26:11

标签: ios objective-c swift gps windev

我正在为WinDev中的一个应用程序开发一个额外的GPS模块。 WinDev支持Swift代码,但仅支持不使用类和全局变量的方法。 这是我所做的(基本上基于Apple文档):

    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的该部分则在需要时读取该值。但这并不能解决问题,因为我仍然必须在WinDev部分中启动变量locationManager。 然后,我想到Java中存在的匿名类,但它在敏捷而客观的C语言中似乎缺失了。

此外,WinDev开发人员社区和文档完全是AFK,所以我没想到会这样。 我显然不知道该怎么做。如果有人有想法或技巧...我会很高兴听到他们的声音。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

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分析工具处理完所有对象后,应确保释放所有对象,否则会发生内存泄漏。

以上代码处理了这些注释,但如果进行了任何修改,则应检查它们。