setNeedsDisplay не работает внутри блока - PullRequest
7 голосов
/ 29 ноября 2011

Я использую CMMotionManager для получения данных акселерометра.Дело в том, что данные акселерометра периодически печатаются, переменные экземпляра меняются в представлении, но представление не перерисовывается.Я проверил, что hv не ноль и что все подключено.Есть ли проблема с вызовом setNeedsDisplay внутри блока?

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler:
     ^(CMAccelerometerData *accelerometerData, NSError *error)
    {

        NSLog(@"%@",accelerometerData);

        HypnosisView *hv = (HypnosisView *) [self view];

        hv.xShift = 10.0 * accelerometerData.acceleration.x;
        hv.yShift = -10.0 * accelerometerData.acceleration.y;

        [hv setNeedsDisplay];

    }];    
}

Ответы [ 3 ]

12 голосов
/ 29 ноября 2011

Это потому, что вы вызываете метод пользовательского интерфейса в потоке, отличном от основного потока.

Добавьте это в свой блок:

dispatch_async(dispatch_get_main_queue(), ^{
    [hv setNeedsDisplay];
});

Помните, что любой метод, работающий с элементами пользовательского интерфейса, долженвызываться из основного потока.

4 голосов
/ 29 ноября 2011

Я сделал то же самое в других блоках, и это сработало, но не с обратным вызовом, который вы здесь используете.Может быть, блок не выполняется в основном потоке?Вы можете проверить это с помощью:

NSLog(@"Main thread? %d", [NSThread isMainThread]);

Если это не так, вы можете заставить setNeedsDisplay запускаться в основном потоке.

0 голосов
/ 03 ноября 2013

Просто хотел проверить ответ @ cocoahero. Я попытался вызвать setTitle для UIButton в неосновном потоке. И название изменилось. Я попробовал это нацеливание на iOS 5.1 и 7.0, используя Xcode 5.0.1. Также я позвонил setNeedsDisplay из неосновного потока, и это тоже сработало.

[NSThread isMainThread] было так, как я убедился, что мои звонки не были из основного потока. Я не уверен, что вызов из не основного потока был причиной вашей проблемы, но, по крайней мере, есть и другие возможности. Вы можете посмотреть на мой ответ для другого вопроса.

...