Obj-C: сбой dispatch_async без NSLog

по какой-то причине у меня есть поток dispatch_async, и он падает, если перед ним не выполняется метод NSLog(). блок запускает метод, который извлекает имя пользователя из базы данных.

крушение:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    user_web_communicator *usrWeb = [[user_web_communicator alloc]init];
    NSString *author = [usrWeb getUsernameFromID:author_string];
    [_author_label setText:[NSString stringWithFormat:@"Author: %@",author]];
});

работающий:

NSLog(@"Fetching author for id: %@",author_string);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    user_web_communicator *usrWeb = [[user_web_communicator alloc]init];
    NSString *author = [usrWeb getUsernameFromID:author_string];
    [_author_label setText:[NSString stringWithFormat:@"Author: %@",author]];
});

ошибка

2013-08-19 13:56:06.149 Poll Me[4995:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '{

Строки: AsyncImageView:0x827aa00.minX == 10 + 1*0x827b8d0.marker + -1*0x8281210.marker + 0,5*0x8281260.marker marker + 0.5*0x82812e0.marker + 0.5*0x82823f0.marker + -0.5*AsyncImageView:0x827aa00.Height Regular_Cell:0x827a400.Height == 56 + 1*0x82823f0.marker Regular_Cell:0x827a400.Width == 3x82 + 1*0.marker Regular_Cell:0x827a400.minX == 0 + 1*0x8281740.marker + -0.5*0x8281ee0.marker Regular_Cell:0x827a400.minY == 46 + 1*0x8281b30.marker + -0.5*0x82823f0.marker + 1*0x827b730.marker + 1*0x827b790.marker + -1*0x827b7d0.marker + 1*UILabel:0x827adc0.Width UILabel:0x827a8e0.minX == 18 + 1*0x827b7d0.marker + 1*0x827b8d0.marker + -1 *0x8281210.marker + 0,5*0x8281260.marker + 1*AsyncImageView:0x827aa00.Width UILabel:0x827a8e0.minY == 19,5 + -1*0x827b810.marker + 1*0x827b890.marker + -1*0x827b910*.marker + - 0x82812a0.marker + 0,5*0x82812e0. marker + 0.5*0x82823f0.marker + 0.5*AsyncImageView:0x827aa00.Height + -1*UILabel:0x827a8e0.Height + -1*UILabel:0x827b140.Height UILabel:0x827adc0.minX == 18 + 1*0x827b730.marker + 1* 0x827b8d0.marker + -1*0x8281210.marker + 0,5*0x8281260.marker + 1*AsyncImageView:0x827aa00.Width UILabel:0x827adc0.minY == 20,5 + 1*0x827b6f0.2 marker UILabel:0x827b140.minX == 18 + 1*0x827b850.marker + 1*0x827b8d0.marker + -1*0x8281210.marker + 0,5*0x8281260.marker + 1*AsyncImageView:0x827aa00.Width UILabel:0x827b142.min. + 1*0x827b890.marker + -1*0x827b910.marker + -1*0x82812a0.marker + 0,5*0x82812e0.marker + 0,5*0x82823f0.marker + 0,5*AsyncImageView:0x827aa00.Height + -1*UILabel:0x827b140.Height :0x827a560.Height == 55 + 1*0x82812e0.marker UITableViewCellContentView:0x827a560.Width == 300 + 1*0x8281260.marker UITableViewCellContentView:0x827a560.minX == 0 + 1*0x8281210.8*marker0 + -08281210.8*marker0 + -0827a560.minX UITableViewCellContentView:0x827a560.minY == 0,5 + 1*0x82812a0.marker + -0,5*0x82812e0.marker target == ‹> + ‹750:-1>*0x8280fc0.negError + ‹250:-1>*0x8280fc0.posErrorMarker + ‹250:-1>*0x8280fc0.posErrorMarker 750:-1>*0x8281030.negError + ‹250:-1>*0x8281030.posErrorMarker

Ограничения: Маркер:0x8281210.marker Маркер:0x8281260.marker Маркер:0x82812a0.marker (настройка интеграции:0,5) 0x827b6f0.marker Маркер: 0x827b730.marker Маркер: 0x827b790.marker Маркер: 0x827b7d0.marker Маркер: 0x827b810.marker Маркер: 0x827b850.marker Маркер: 0x827b850.marker Marker: 0x827b890.markermer Marker: 0x827b8d0.marker Маркер: 0x827b910.marker Маркер: 0x8281ee0.marker Маркер: 0x82823f0.marker }: внутренняя ошибка. Не удается найти заголовок исходящей строки для входящего заголовка 0x8280fc0.negError, чего никогда не должно произойти». * Первый стек бросить вызов: (0x195d012 0x166ae7e 0x195cdeb 0xefef89 0xf01fcf 0xf020d3 0x7d86dc 0x7d9280 0x7dd4a3 0x3f7e3c 0x3f8022 0x3f8064 0x2f33b 0x277553f 0x2787014 0x27782e8 0x2778450 0x92710e72 0x926f8d2a) (lldb)

не могли бы вы сказать мне, почему это может происходить? я не хочу держать NSLog() там, потому что он запускает его несколько раз и мешает при попытке прочитать вывод. Заранее спасибо =)

Установка свойства text метки в фоновом потоке или любых других изменений пользовательского интерфейса в этом отношении является неопределенным поведением. Поскольку это поведение undefined, я не могу объяснить, почему оно работает с

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    user_web_communicator *usrWeb = [[user_web_communicator alloc]init];
    NSString *author = [usrWeb getUsernameFromID:author_string];
    [_author_label setText:[NSString stringWithFormat:@"Author: %@",author]];
});
, но вам нужно отправить установку текста метки в основной поток.


person Eddie Callahan    schedule 19.08.2013    source источник
comment
обновление сейчас... извините, сообщение об ошибке очень длинное   -  person George Mitchell    schedule 19.08.2013
comment
В дополнение к моему ответу ниже покажите, как вы определяете/устанавливаете author_string. Там может быть что-то еще.   -  person Eddie Callahan    schedule 19.08.2013
comment
author_string — это просто целочисленный идентификатор, добавленный к URL-адресу, который связывается с документом PHP, извлекающим имя пользователя. Ваш ответ сработал отлично, это была просто проблема ветки. Спасибо большое!!!   -  person Joe    schedule 19.08.2013
comment
_1_ может работать в этом примере, но в целом будьте осторожны, чтобы не создавать взаимоблокировки, когда два блока и их потоки ждут друг друга.   -  person Eddie Callahan    schedule 19.08.2013


Ответы (1)


Возможно, будет легче ответить, если вы укажете фактические сообщения об ошибках в своем вопросе :)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    user_web_communicator *usrWeb = [[user_web_communicator alloc]init];
    NSString *author = [usrWeb getUsernameFromID:author_string];

    dispatch_sync(dispatch_get_main_queue(), ^{
        [_author_label setText:[NSString stringWithFormat:@"Author: %@",author]];
    })
});
person Joe    schedule 19.08.2013
comment
Ограничения: Маркер:0x8281210.marker Маркер:0x8281260.marker Маркер:0x82812a0.marker (настройка интеграции:0,5) 0x827b6f0.marker Маркер: 0x827b730.marker Маркер: 0x827b790.marker Маркер: 0x827b7d0.marker Маркер: 0x827b810.marker Маркер: 0x827b850.marker Маркер: 0x827b850.marker Marker: 0x827b890.markermer Marker: 0x827b8d0.marker Маркер: 0x827b910.marker Маркер: 0x8281ee0.marker Маркер: 0x82823f0.marker }: внутренняя ошибка. Не удается найти заголовок исходящей строки для входящего заголовка 0x8280fc0.negError, чего никогда не должно произойти». <Сильный> * Первый стек бросить вызов: (0x195d012 0x166ae7e 0x195cdeb 0xefef89 0xf01fcf 0xf025c7 0xf0d58f 0xf0d6d4 0x7d860a 0x7e02af 0x7e03be 0x2e7601 0x49484e 0x354ced 0x2e940c 0x354a7b 0x359919 0x3599cf 0x3421bb 0x352b4b 0x2ef2dd 0x167e6b0 0x17dfc0 0x17233c 0x172150 0xf00bc 0xf1227 0xf18e2 0x1925afe 0x1925a3d 0x19037c2 0x1902f44 0x1902e1b 0x29be7e3 0x29be668 0x29effc 0x1e5ed 0x1d75) 2013 -08-19 13:56:06.149 Опросить меня[4995:4f03] * Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "{ Строки: AsyncImageView:0x827aa00.minX == 10 + 1*0x827b8d0. маркер + -1*0x8281210.marker + 0,5*0x8281260.marker 0.5*AsyncImageView:0x827aa00.Height Regular_Cell:0x827a400.Height == 56 + 1*0x82823f0.marker Regular_Cell:0x827a400.Width == 320 + 1*0x8281ee0.marker Regular_Cell:0x827a400.minX == 0 + 1*470x8.2mark er + -0.5*0x8281ee0.marker Regular_Cell:0x827a400.minY == 46 + 1*0x8281b30.marker + -0.5*0x82823f0.marker UILabel:0x827a8e0.Width == 0 + 1*0x827b730.marker + 1*0x827b790.marker -1*0x827b7d0.marker + 1*UILabel:0x827adc0.Width UILabel:0x827a8e0.minX == 18 + 1*0x827b7d0.marker + 1*0x827b8d0.marker + -1*0x8281210.marker + 0,5*0x8281260.marker + 1* AsyncImageView:0x827aa00.Width UILabel:0x827a8e0.minY == 19,5 + -1*0x827b810.marker + 1*0x827b890.marker + -1*0x827b910.marker + -1*0x82812a0.marker + 0,5*0x82812e0.5*0.marker .marker + 0,5*AsyncImageView:0x827aa00.Height + -1*UILabel:0x827a8e0. Высота + -1*UILabel:0x827b140.Height UILabel:0x827adc0.minX == 18 + 1*0x827b730.marker + 1*0x827b8d0.marker + -1*0x8281210.marker + 0,5*0x8281260.marker + 1*AsyncImageView:0x827aa00. Ширина UILabel:0x827adc0.minY == 20,5 + 1*0x827b6f0.marker + -1*0x82812a0.marker + 0,5*0x82812e0.marker UILabel:0x827b140.minX == 18 + 1*0x827b850.marker + 1*0x827b8d0 1*0x8281210.marker + 0.5*0x8281260.marker + 1*AsyncImageView:0x827aa00.Width UILabel:0x827b140.minY == 27,5 + 1*0x827b890.marker + -1*0x827b910.marker + -1*0x82812a0.marker 0x82812e0.marker + 0,5 * 0x82823f0.marker + 0.5 * asyncimageview: 0x827aa00.height + -1 * UILabel: 0x827b140.height uableviewcellcontentview: 0x827A560.height == 55 + 1 * 0x82812e0.marker UiableViewcellcontentView: 0x827A560.Width == 300 + 1 *0x8281260.marker UITableViewCellContentView:0xlibc++abi.dylib: завершение, вызываемое созданием исключения827a560.minX == 0 + 1*0x8281210.marker + -0.5*0x8281260.marker UITableViewCellContentView:0x8 27a560.minY == 0,5 + 1*0x82812a0.marker + -0,5*0x82812e0.marker target == ‹> + ‹750:-1>*0x8280fc0.negError + ‹250:-1>*0x8280fc0.posErrorMarker + ‹750: -1>*0x8281030.negError + ‹250:-1>*0x8281030.posErrorMarker - person Jesper; 20.08.2013