почему я получаю "wait_fences: не удалось получить ответ" для этого кода? - PullRequest
2 голосов
/ 07 ноября 2011

почему я получаю "wait_fences: не удалось получить ответ" для этого кода? Это способ, которым я использую уведомления для связи обратно с основным потоком?

#import "ViewController.h"

@implementation ViewController

@synthesize  alert;


#pragma mark - Background Thread Test Methods

- (void) ConfigTasksForBackground:(id)sender{
    NSLog(@"ConfigTasksForBackground - Starting");
    [NSThread sleepForTimeInterval:6];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ModelChanged" object:self];
    NSLog(@"ConfigTasksForBackground - Ending");
}

#pragma mark - Callbacks

- (void) ModelChangedHandler:(NSNotification *) notification {
    if ([[notification name] isEqualToString:@"ModelChanged"]) {
        NSLog(@"ModelChangedHandler");
        [self.alert dismissWithClickedButtonIndex:0 animated:false];
    }
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(ModelChangedHandler:) 
                                                 name:@"ModelChanged"
                                               object:nil];
}

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

    self.alert = [[[UIAlertView alloc] initWithTitle:@"Title" 
                                                    message:@"viewDidAppear" 
                                                   delegate:nil 
                                          cancelButtonTitle:nil
                                          otherButtonTitles:nil] autorelease];
    [alert show];
    [self performSelectorInBackground:@selector(ConfigTasksForBackground:) withObject:nil];
}



@end

Вывод:

2011-11-07 15:15:42.730 test_background[6876:13603] ConfigTasksForBackground - Starting
2011-11-07 15:15:48.734 test_background[6876:13603] ModelChangedHandler
2011-11-07 15:15:49.236 test_background[6876:13603] ConfigTasksForBackground - Ending
wait_fences: failed to receive reply: 10004003

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Здесь есть очевидная проблема.Вы публикуете уведомление из фонового потока (что нормально), что означает, что обработчик уведомлений ModelChangedHandler вызывается в фоновом потоке.Затем обработчик отклоняет представление оповещения, которое должно быть выполнено в главном потоке.Попробуйте изменить код на:

- (void) ModelChangedHandler:(NSNotification *) notification {
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(ModelChangedHandler:) withObject:notification waitUntilDone:NO];
    }

    else if ([[notification name] isEqualToString:@"ModelChanged"]) {
        NSLog(@"ModelChangedHandler");
        [self.alert dismissWithClickedButtonIndex:0 animated:false];
    }
}

РЕДАКТИРОВАТЬ: слишком быстро печатал, изменил ответ для отображения правильных объектов пользовательского интерфейса.

2 голосов
/ 07 ноября 2011

Вот как избавиться от ошибки wait_fences.Измените строку, в которой вы закрываете alertView, чтобы использовать анимацию, следующим образом:

[self.alert dismissWithClickedButtonIndex:0 animated:YES];

Я думаю, что wait_fences как-то связан с состояниями анимации представления с представлениями оповещения, но об этом сложно знать точно.Я думаю, что это должно устранить ошибку MSG, хотя.Мой другой ответ не устраняет ошибку напрямую, но я все же рекомендую ее.Действия пользовательского интерфейса должны выполняться в главном потоке.

...