2012-07-31 67 views
0

我正在使用新的CoreMotion框架来监视某些硬件设备。这里是典型的代码来做到这一点:辅助队列中的Perfoming UI更新

-(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]]; 

}

它工作得很好,我真的不认为有任何理由为什么这会让人不悦。对此有何想法?

+0

我不能说一定的iOS,但在Swing(这也需要UI更新发生在特定线程上),您的示例的等价物正是您应该做的。 – millimoose 2012-07-31 01:20:08

回答

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更新发生在主线程上。所以我不会担心改变任何事情。

+0

你的代码正是我所做的。感谢您的确认。 – VaporwareWolf 2012-07-31 05:46:58

0

你missunderstanding块的概念,把它简单:

块是代码小片,可以作为变量进行处理,并在某个时间或线程来执行。

所有的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