在 IOS 中开发而不使用全局变量和 class

Develop in IOS without using Global Variable and class

我正在为 WinDev 中的应用程序开发一个额外的 GPS 模块。 WinDev 支持 Swift 代码,但只支持排除 class 和全局变量使用的方法。 这是我所做的(基本上基于 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()" 必须是全局的。所以我想知道是否有办法避免全局变量。

首先,我尝试了类似的操作:swift 中的部分在每次调用 LocationManage(didUpdateLocation) 时写入磁盘,而 WinDev 中的部分在他需要时读取值。但这并不能解决问题,因为我仍然必须在 WinDev 部分启动变量 locationManager。 然后我想到 Java 中存在的匿名 class,但 swift 和 objective C 中似乎缺少它。

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

你可以这样做:

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,你应该确保location manager在释放之前被释放view controller 确实如此,否则如果位置管理器的寿命超过其委托(视图控制器)并尝试访问它,您的应用程序将崩溃。

  • 您应该确保在使用内存图调试器或 Xcode 分析工具完成所有对象后释放所有对象,否则会出现内存泄漏。

上面的代码处理了这些注释,但是如果你做了任何修改,你应该检查它们。