在 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 分析工具完成所有对象后释放所有对象,否则会出现内存泄漏。
上面的代码处理了这些注释,但是如果你做了任何修改,你应该检查它们。
我正在为 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 分析工具完成所有对象后释放所有对象,否则会出现内存泄漏。
上面的代码处理了这些注释,但是如果你做了任何修改,你应该检查它们。