NSWindow IBOutlet не остается синхронным - PullRequest
0 голосов
/ 24 мая 2019

Код Mac OS X с использованием IBOutlet, который не обновляется непрерывно во время функции, но обновляется в конце функции.

Я использую Xcode 10.2.1. Я пробовал показ, обновление, displayIfNeeded и принудительное выполнение основного потока, используя performSelectorOnMainThread.

- (IBAction) Test:(id)sender
{
int  k;
int j = [obsInput intValue];
kvoObjONE *one = [[kvoObjONE alloc] init];
kvoObjTWO *two = [[kvoObjTWO alloc] init];
one.x = j;
[one addObserver:two forKeyPath:@"x" options:NSKeyValueObservingOptionNew context:NULL];

for (k=0; k<10; k++)
{
    one.x = one.x + 10;
    usleep(100000);
    [echInput setIntValue: one.x];
 //   [echInput setIntValue: 34+k];
    [outFromIn setIntValue: two.y];
    NSLog(@"x %d  y %d ", one.x, two.y);
    NSLog(@"   echInput %d", [echInput intValue]);

    [self performSelectorOnMainThread:@selector(WSdisplay) withObject:@"nil" waitUntilDone:YES];
}
[one removeObserver:two forKeyPath:@"x"];

};

- (void)WSdisplay
{
//   [[self.window contentView] setNeedsDisplay:YES];

//  [self.window displayIfNeeded];
[self.window update];
[self.window display];

NSLog(@"display message 2\n");
}

Я ожидаю, что мои IBOutlets (echInput и outFromIn) будут меняться в моем NSWindow каждый раз через цикл for. Это не происходит каждый раз в цикле, но происходит после оператора removeObserver. Я ожидаю, что консоль будет показывать значения one.x, two.y, echInput и отображать сообщение для каждого цикла, и это происходит.

1 Ответ

0 голосов
/ 25 мая 2019

У меня есть [...] принудительное выполнение в главном потоке с помощью executeSelectorOnMainThread

Ваша Test: функция уже работает в главном потоке, который является вашимпроблема.Вы блокируете основной поток, и обновления пользовательского интерфейса не будут происходить, пока вы не разблокируете его (т. Е. При возврате из функции Test:).

Вместо этого вы можете запустить свой код в потоке, например:

- (IBAction) Test:(id)sender
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Current body of `Test:` function here

Теперь внутри этого блока dispatch_async вы не можете касаться объектов UI.Вам нужно будет обернуть любые такие вызовы в другой dispatch, на этот раз обратно в основной поток, например

dispatch_async(dispatch_get_main_queue(), ^{
    [echInput setIntValue: one.x];
    [outFromIn setIntValue: two.y];
    NSLog(@"x %d  y %d ", one.x, two.y);
    NSLog(@"   echInput %d", [echInput intValue]);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...