Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何保存处理程序中生成的数据?_Ios_Swift_Accelerometer_Core Motion - Fatal编程技术网

Ios 如何保存处理程序中生成的数据?

Ios 如何保存处理程序中生成的数据?,ios,swift,accelerometer,core-motion,Ios,Swift,Accelerometer,Core Motion,当我的加速计移动时,处理程序代码(在本例中,收集加速计数据)正在异步执行 这意味着,如果我试图将data.x,data.y,data.z保存在变量中,即使该变量在处理程序之外声明,如果我尝试在任何地方打印它,该变量也将是nil 如何保存这些数据以便在代码的其他部分中访问? (或者一切都必须在我的处理程序中发生,从最佳实践来看?) 需要注意的主要问题是,这些事件的发生速度可能比主线程处理它们的速度更快。正如文件所说: 由于处理的事件可能以较高的速率到达,因此不建议使用主操作队列 因此,您应该使用自

当我的加速计移动时,处理程序代码(在本例中,收集加速计数据)正在异步执行

这意味着,如果我试图将
data.x
data.y
data.z
保存在变量中,即使该变量在处理程序之外声明,如果我尝试在任何地方打印它,该变量也将是
nil

如何保存这些数据以便在代码的其他部分中访问? (或者一切都必须在我的处理程序中发生,从最佳实践来看?)


需要注意的主要问题是,这些事件的发生速度可能比主线程处理它们的速度更快。正如文件所说:

由于处理的事件可能以较高的速率到达,因此不建议使用主操作队列

因此,您应该使用自己的后台队列来处理这些事件

关于如何在主线程上使用此更新信息,有两个注意事项:

  • 为了确保代码是线程安全的,必须同步从该后台线程和其他线程使用的任何变量

  • 确保不只是将更新发送回主线程。我通常会创建一个
    dispatch\u source\u TYPE\u DATA\u或
    dispatch\u source\u TYPE\u DATA\u ADD
    的调度源,将该源的处理程序放在主队列上,然后您的
    motionQueue
    可以在该源上执行
    dispatch\u source\u merge\u DATA

    然后,GCD将合并这些数据更改,在有更新时通知主线程,但不会在过程中备份主线程


  • 顺便说一下,您可能还想查看的表4-1,其中概述了加速度事件的常见更新间隔(以Hz为单位),具体取决于预期用途:

    • 10–20:适用于确定设备的当前方向向量

    • 30–60:适用于使用加速计进行实时用户输入的游戏和其他应用程序

    • 70–100:适用于需要检测高频运动的应用程序。例如,您可以使用此时间间隔来检测用户是否快速敲击设备或晃动设备


    您可能需要选择一个与应用程序需要相称的
    设备移动更新间隔

    您可以发布一些代码吗?是的!我通常会发现问题更多的是概念性的,而不是代码级别的(这往往会混淆事情),但有时代码有助于举例说明!刚刚发布了一个简短的功能。我想保存grav.x。您可能需要将数据保存在某个属性中,并调用某个函数(或发布通知),告知有数据要处理。具体采取什么行动取决于您想对数据做什么。假设您希望使用新数据更新绘图-您可以调用一个函数,通过读取将数据添加到数组属性并刷新图形。如果您想在读取值高于某个阈值时发出警报,那么您可以调用一个函数,该函数只需比较值,如果需要播放声音,然后放弃读取。(续)所有这些都需要在处理程序或处理程序调用的代码中发生事件驱动处理是现代编程中的一个重要概念。应用程序大量使用它,而不是运行大量线性代码,你的应用程序运行代码来响应事件,涉及UIElement、传感器更新、网络通知等
        if motionManager.accelerometerAvailable{
                        let motionQueue = NSOperationQueue.mainQueue()
                        motionManager.startDeviceMotionUpdatesToQueue(motionQueue,
                        withHandler: gravityUpdated)
        }
     func gravityUpdated(motion: CMDeviceMotion!, error: NSError!) {
            let grav : CMAcceleration = motion.gravity;
            println(grav.x)
      }