filterX
を加速度計の更新に従って更新したいのですが、変数は私が構築する時の半分の時間でnil
です。最初はself
で範囲の問題だと思っていましたが、残りの半分はうまくいきませんでした。スウィフト変数は時間の半分ではありません
私の2番目の推測は、ある種の競合状態だったということでした。親関数が0.1秒ごとに実行されるため、コードは同期的に実行されているため、それ自体は修正する必要があります。
何か助けていただければ幸いです。
class LocationTrackingService: CLLocationManagerDelegate {
static let sharedInstance = LocationTrackingService()
private override init() {}
var locationManager = CLLocationManager()
var motionManager = CMMotionManager()
var filterX : KalmanFilter<Double>?
func startTracking() {
locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.startUpdatingLocation()
motionManager.startAccelerometerUpdates()
let location = locationManager.location!
let XYCoord = LatLonToXY(coordinate: (location.coordinate))
self.filterX = KalmanFilter(stateEstimatePrior: XYCoord.x, errorCovariancePrior: pow(location.horizontalAccuracy, 2))
}
if motionManager.isAccelerometerAvailable {
print(self.filterX) // <-- prints object no problem
motionManager.accelerometerUpdateInterval = 0.1
motionManager.startAccelerometerUpdates(to: OperationQueue.main) { data, _ in
print(self.filterX) // <------- prints nil half the time (i.e. half of the builds)
if let acceleration = data?.acceleration {
if self.filterX != nil {
// do stuff
}
}
}
}
}
ビルドの半分?ビヘイビアがビルドからビルドに変わることを意味しますか? –
はい。ビルドからビルドへの動作の変更。特に時々それは適切な値であり、他の回はその無しである。 – dmr07
filterXがnilに設定されているときに、KalmanFilterに渡されると、XYCoord.xはnilではありませんか? location.horizontalAccuracyはどうですか?両方がうまく見える場合は、self.filterXではなくローカルのvarを設定してみてください。もしローカルvarにもnilすることができれば、私はあなたのKalmanFilter()エラーでなければならないと思います。 – Smartcat