NSOperationQueue и отправка делегата в основной поток - PullRequest
0 голосов
/ 16 февраля 2012

Привет, у меня есть классовые датчики, где у меня есть GPS, гироскоп, акселерометр и я хочу отправить данные в делегат из nsoperationqueue:

@protocol SensorsDelegate <NSObject>
@optional
- (void)motionManagerDidAccelerateData:(CMAccelerometerData *)accelerometerData;
@end


- (void)startAccelerometr
{
    if (motionManager.accelerometerAvailable) {

        self.motionManager.accelerometerUpdateInterval = 1.0/10.0;
        [self.motionManager startAccelerometerUpdatesToQueue:self.operationQueue 
          withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            if (error) {
                [motionManager stopAccelerometerUpdates];
            }
            else {
                [self.delegate motionManagerDidAccelerateData:accelerometerData];
            }
        }];
    }
}

Как отправить данные делегату, который находится в основном потоке ?? Или отправить данные на ускорение?

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

Можно попробовать:

Предполагая, что делегат является свойством типа NSObject<SensorDelegate>*, назначенным при методе инициализации датчика:

[self.delegate performSelectorOnMainThread:@selector(motionManagerDidAccelerateData:) withObject:accelerometerData waitUntilDone:NO];

Надеюсь, это поможет.

2 голосов
/ 16 февраля 2012

Вы пробовали использовать

[self.delegate performSelectorOnMainThread:@selector(motionManagerDidAccelerateData:) withObject:accelerometerData waitUntilDone:NO];
2 голосов
/ 16 февраля 2012

Поместите onMainThread: метод в тот же класс и измените ваш код следующим образом

- (void)startAccelerometr
{
        if (motionManager.accelerometerAvailable) {

        self.motionManager.accelerometerUpdateInterval = 1.0/10.0;
        [self.motionManager startAccelerometerUpdatesToQueue:self.operationQueue 
          withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            if (error) {
                [motionManager stopAccelerometerUpdates];
            }
            else {
                [self performSelectorOnMainThread:@selector(onMainThread:)
                  withObject:accelerometerData waitUntilDone:NO];
            }
        }];
    }
}

- (void)onMainThread:(id)accelerometerData{
    [self.delegate motionManagerDidAccelerateData:accelerometerData];
}
1 голос
/ 16 февраля 2012

Изменить очередь, в которую вы отправляете обновления акселерометра, в основную очередь.

    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...