0

我正在使用新的 CoreMotion 框架来监控一些硬件设备。这是执行此操作的典型代码:

-(void)startAccelerometer{
self.motion.accelerometerUpdateInterval = 1/30.0f;
NSOperationQueue* accelerometerQueue = [[NSOperationQueue alloc] init];
CMAccelerometerHandler accelerometerHandler = ^(CMAccelerometerData *accelerometerData, NSError *error) {

    NSLog(@"Accelerometer realtime values");
    NSLog(@"x=%f", accelerometerData.acceleration.x);
    NSLog(@"y=%f", accelerometerData.acceleration.y);
    NSLog(@"z=%f", accelerometerData.acceleration.z);
    NSLog(@"  ");

};
[self.motion startAccelerometerUpdatesToQueue:accelerometerQueue withHandler:[[accelerometerHandler copy]autorelease]];

}

这工作得很好。现在我想在 UILabel 上打印值,但由于 CoreMotion 框架让您使用块,因此不能保证它在主队列中(实际上不适用于我的应用程序)。像这样在主队列上运行标签的设置器是“错误的”吗?

-(void)startAccelerometer{
self.motion.accelerometerUpdateInterval = 1/30.0f;
NSOperationQueue* accelerometerQueue = [[NSOperationQueue alloc] init];
CMAccelerometerHandler accelerometerHandler = ^(CMAccelerometerData *accelerometerData, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.lblAccelerometer.text = [NSString stringWithFormat:@"Accelerometer:\nx = %f\ny = %f\nz = %f",
                                      accelerometerData.acceleration.x,
                                      accelerometerData.acceleration.y,
                                      accelerometerData.acceleration.z];

    });

};
[self.motion startAccelerometerUpdatesToQueue:accelerometerQueue withHandler:[[accelerometerHandler copy]autorelease]];

}

它工作得很好,我真的看不出有什么理由会不赞成。对此有什么想法吗?

4

2 回答 2

1

这是我在许多项目中使用的常用方法。UI 更新必须发生在主线程上。

//Dispatch on background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    //background processing goes here

    //Dispatch on main thread
    dispatch_async(dispatch_get_main_queue(), ^{
            //update UI here
    });
});

在您的情况下,您的 UI 更新发生在主线程上。所以我不会担心改变任何东西。

于 2012-07-31T02:48:11.830 回答
0

您误解了块的概念,简单地说:

块是可以作为变量处理并在特定时间或线程上执行的小段代码。

所有 UI 更新都必须在主线程上执行,所以只要你这样做就可以了。

代码可以在同步或异步模式下在具有不同优先级的不同线程中执行。在您的代码上,您做得非常好,您不仅将它分派到应该执行 uiupdates 的主队列,而且您还分派它异步,这是更新发送到主队列的最安全方式(来自您的代码我不知道您是从主队列还是辅助队列运行这段特定的代码,但是如果您要将同步块从主队列分派到主队列,您的程序将停止工作)

对于 iOS 文档:

使用 dispatch_get_main_queue 函数获取与应用程序主线程关联的串行调度队列。此队列是为 Cocoa 应用程序和调用 dispatch_main 函数或在主线程上配置运行循环(使用 CFRunLoopRef 类型或 NSRunLoop 对象)的应用程序自动创建的。

在这里阅读http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

于 2012-07-31T02:16:10.060 回答