我正在为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,所以我没想到会这样。 我显然不知道该怎么做。如果有人有想法或技巧...我会很高兴听到他们的声音。
答案 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分析工具处理完所有对象后,应确保释放所有对象,否则会发生内存泄漏。
以上代码处理了这些注释,但如果进行了任何修改,则应检查它们。