по какой-то причине у меня есть поток 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, чего никогда не должно произойти». * EM> Первый стек бросить вызов: (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]];
});
, но вам нужно отправить установку текста метки в основной поток.