Прежде чем манипулировать чем-либо, что может вызвать некоторое рисование, вы должны убедиться, что вы находитесь в главном потоке.
Например, если вы хотите перезагрузить UITableView из отдельного потока, вы должны вызвать:
[myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
И если у вас есть несколько операторов, которые могут вызвать рисование, у вас может быть отдельный метод, который выполняет рисование и обеспечивает его выполнение в основном потоке:
- (void) asyncDoSomeStuff {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Do your stuff
...
// Update UI
[self performSelectorOnMainThread:@selector(refreshGUI) withObject:nil waitUntilDone:NO];
[pool release];
}
- (void) refreshGUI {
[myTableView reloadData];
[myImageView setImage:[UIImage imageNamed:@"blabla.png"]];
...
}
И, наконец, есливы не уверены в том, какой поток будет вызывать конкретный метод, выполняющий какое-либо рисование, тогда в начале метода вы можете добавить следующую инструкцию, которая обеспечит выполнение всего метода в основном потоке:
- (void) myMethod {
if(![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO];
return;
}
// Do your stuff
}
В противном случае я не думаю, что существует решение, позволяющее обнаружить, что какой-то рисунок будет выполняться вне основного потока.Например, все, что связано с UIKit, должно происходить в главном потоке.