Ios 变量进入DispatchQueue后变为0(在模拟器中工作,在实际设备中为0)

Ios 变量进入DispatchQueue后变为0(在模拟器中工作,在实际设备中为0),ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,代码错误,变量(以秒为单位的训练时间)未传递到GCD函数调用中。但是,workoutStartDateTime没有问题通过。这是我正在使用的代码 var seconds: Int = 0 var workoutStartDateTime: Date? func finishWorkout() { print("0 FinishWorkout:\(seconds) workoutStartDateTime:\(workoutStartDateTime)"

代码错误,变量(以秒为单位的训练时间)未传递到GCD函数调用中。但是,
workoutStartDateTime
没有问题通过。这是我正在使用的代码

  var seconds: Int = 0
  var workoutStartDateTime: Date?


  func finishWorkout() {
    print("0 FinishWorkout:\(seconds) workoutStartDateTime:\(workoutStartDateTime)")
    
    DispatchQueue.global(qos: .utility).async { [self] in
      print("1 FinishWorkout:\(self.seconds) workoutStartDateTime:\(workoutStartDateTime)")
      TCXfuncs.writeTCX(workoutStartDateTime: workoutStartDateTime!, seconds: seconds)
      
    }
这是打印出来的

0 FinishWorkout:3 workoutStartDateTime:Optional(2021-01-28 03:05:29 +0000)
1 FinishWorkout:0 workoutStartDateTime:Optional(2021-01-28 03:05:29 +0000)
// I also placed a print statement into the TCXFunc function to verify.
TCXExportFunction seconds:0
奇怪的是,当我在模拟器中运行它时,它工作了。通过的秒数

0 FinishWorkout:3 workoutStartDateTime:Optional(2021-01-28 03:05:29 +0000)
1 FinishWorkout:3 workoutStartDateTime:Optional(2021-01-28 03:05:29 +0000)
// I also placed a print statement into the TCXFunc function to verify.
TCXExportFunction seconds:3
编辑:(和解决方案)

经过多次尝试和SO/Googles,我找到了这个SO-->并使用它。现在的问题是为什么

  func finishWorkout() {
    let mySec = seconds
    print("0 FinishWorkout:\(seconds) mySec:\(mySec) workoutStartDateTime:\(workoutStartDateTime)")
    
    DispatchQueue.global(qos: .utility).async { [self] in
      print("1 FinishWorkout:\(self.seconds) mySec:\(mySec)  workoutStartDateTime:\(workoutStartDateTime)")
      TCXfuncs.writeTCX(workoutStartDateTime: workoutStartDateTime!, seconds: mySec) // << Pass the "helper" variable
      
    }

我认为这是一个时间问题。“dispatch.async()”调用意味着“在将来某处执行此操作”。这可能很快(微秒)甚至很晚(毫秒),但应用程序的其他部分可能会同时重置“秒”


当您在提交分派呼叫之前将当前内容“保存”到一个局部变量中时,无论分派项目何时开始工作,此值都可用。

还有一个一般提示:存在“铁律”“…永远不要在不同的队列中处理变量…或者只是有时..副作用太复杂,可能会在将来的版本中导致问题..

你完全正确。我只是重新检查了代码并注释掉了我重置所有内容以准备下一次训练的部分。”(因为我已经调用了
finishWorkout
),并且该值在没有问题的情况下通过。当然,奇怪的是,在模拟器上运行它时,不会看到这种行为。”_(ツ)_/’很高兴它对您有所帮助。是的,这个时间问题取决于许多情况,甚至不同的硬件(模拟器)也会改变结果。“好”笔记本电脑上的模拟器有时比“真实”移动设备更快。
0 FinishWorkout:119 mySec:119 workoutStartDateTime:Optional(2021-01-28 04:04:33 +0000)
1 FinishWorkout:0   mySec:119 workoutStartDateTime:Optional(2021-01-28 04:04:33 +0000)
// I also placed a print statement into the TCXFunc function to verify.

writeTCX Passed seconds:119 Date:2021-01-28 04:04:33 +0000