Quão importante é usar `performSelectorOnMainThread: withObject: waitUntilDone:` De uma NSOperation?

Meu aplicativo para iPad sincroniza com um feed XML, executando a sincronização em uma subclasse NSOperation executada a partir de um NSOperationQueue. Ao analisar o feed, ele volta para o thread principal viaperformSelectorOnMainThread:withObject:waitUntilDone: para atualizar várias partes da interface do usuário, agendar downloads etc. Isso é bastante caro; a interface do usuário às vezes pode deixar de responder por um ou dois segundos à medida que a sincronização ocorre.

Para tornar a interface do usuário mais responsiva, removi o uso deperformSelectorOnMainThread:withObject:waitUntilDone: a favor de chamadas diretas para executar todas as tarefas relacionadas à sincronização, incluindo a atualização da interface do usuário. Portanto, agora a sincronização ocorre inteiramente no encadeamento em segundo plano criado pelo NSOperationQueue. Isso parece funcionar muito bem, e a interface do usuário é muito mais responsiva durante uma sincronização.

No entanto, estou desconfiado de me libertar dessa maneira. Eu já vi algumas menções em vários lugares que só devem atualizar a interface do usuário no thread principal (exemplo com referência ao AppKit) Mas não consegui encontrar nada específico sobre esse tópico na documentação.

Então, qual é a importância de atualizar a interface do usuário no thread principal? Quais partes de um aplicativo são seguras contra thread e quais não? Existe talvez uma referência explicando o que é seguro executar em uma NSOperation e o que deve ser executado apenas no segmento principal do iOS? Estou realmente fazendo algo inseguro ou propenso a acidentes?