Как использовать PerformSelector в блоке

Ниже приведен код:

if ([motionManager isAccelerometerAvailable] == YES) {
    motionManager.deviceMotionUpdateInterval = 1.0 / 100.0;
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
                    [self performSelector:@selector(exchangeCard)
                               withObject:nil
                               afterDelay:0];

    }];

Я обнаружил, что селектор не был вызван на блоке. Итак, мой вопрос заключается в том, как заставить PerformSelector вызывать функцию в блоке.


person user1361168    schedule 14.04.2013    source источник
comment
Почему вы используете performSelector вместо простого вызова метода?   -  person Marcelo Fabri    schedule 14.04.2013
comment
Что значит называется на блоке? exhangeCard вызывается? performSelector: звонят? - Знаете ли вы, что на самом деле вам не следует использовать startAccelerometerUpdatesToQueue, если вы не понимаете многопоточность?   -  person matt    schedule 14.04.2013
comment
приведенный выше код выглядит нормально. Вы уверены, что блок выполняется?   -  person Gabriele Petronella    schedule 14.04.2013
comment
И, как сказал @MarceloFabri, почему бы вам просто не вызвать [self exchangeCard] из блока?   -  person Gabriele Petronella    schedule 14.04.2013
comment
См. также stackoverflow.com/questions/15818527/   -  person matt    schedule 14.04.2013
comment
Да, я понимаю, что для решения этой проблемы можно использовать [self exchangecard]. Но дело в том, почему PerformSelector нельзя использовать в блоке и как его использовать в блоке. Потому что я столкнулся с проблемой, что функция будет использовать какой-то закрытый класс, который будет использовать PerformSelector, чтобы что-то делать. Таким образом, коды просто описание. @матовый   -  person user1361168    schedule 14.04.2013


Ответы (1)


Обычно нет необходимости использовать startAccelerometerUpdatesToQueue:, и вам определенно не следует его использовать, если вы не знаете, что делаете с потоками. Мне не кажется, что ты это делаешь! Способ использования диспетчера движений заключается в том, чтобы запустить его, а затем просто несколько раз спрашивать об обновлениях (это можно настроить с помощью повторяющегося NSTimer).

self.motman = [CMMotionManager new];
if (!self.motman.accelerometerAvailable) {
    NSLog(@"oh well");
    return;
}
self.motman.accelerometerUpdateInterval = // whatever
[self.motman startAccelerometerUpdates];
NSTimeInterval t = self.motman.accelerometerUpdateInterval * 10;
self.timer =
    [NSTimer
        scheduledTimerWithTimeInterval:t
        target:self selector:@selector(poll:) userInfo:nil repeats:YES];

Итак, теперь poll: будет вызываться неоднократно, и вы можете делать все, что хотите:

- (void) poll: (id) dummy {
    // ask self.motman for current values here; for example:
    CMAccelerometerData* dat = self.motman.accelerometerData;
    // now do something with that info
}

Фактический код и полное объяснение того, как использовать диспетчер движения для получения значений ускорения, см. в моей книге: http://www.apeth.com/iOSBook/ch35.html#_raw_acceleration

person matt    schedule 14.04.2013
comment
deviceMotionUpdateInterval не является чем-либо — the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. - person Andrei G.; 14.04.2013
comment
Нет, @AndreiG., читай документы. Интервал обновления — это одно; таймер другой. Это еще одна веская причина для опроса. Менеджер движений будет обновляться с своим интервалом; вы просто собираете информацию так часто, как тебе нужно. - person matt; 14.04.2013
comment
согласен, просто ваш код использует accelerometerUpdateInterval для установки задержки NSTimer (пример: если я установлю accelerometerUpdateInterval на 0,01 - NSTimer будет работать за пределами рекомендуемого диапазона частот), IMO лучше сделать эти два независимыми друг от друга, и жестко -code NSTimer задержка так часто, как вам нужно для опроса. В остальном все прекрасно, ура :) - person Andrei G.; 14.04.2013
comment
Мой таймер в десять раз медленнее, чем интервал обновления диспетчера движения, и в любом случае OP, конечно, может использовать любые подходящие значения. - person matt; 14.04.2013