В дополнение к ответам выше небезопасно устанавливать arrFAQData из вторичного потока, подобного этому.Основной риск состоит в том, что что-то в главном потоке будет частично выполняться через старое значение arrFAQData, когда значение внезапно изменится.Абсолютный наихудший случай - это что-то вроде середины основного потока:
for(id object in arrFAQData)
{
... something ...
}
Если вы отпустите то, на что указывает arrFAQData, и добавите что-нибудь еще во вторичный поток, то вы в конечном итоге попытаетесьдля доступа к освобожденной памяти.Точно так же вы не можете сохранить arrFAQData как тот же логический массив и просто скопировать в него новые объекты, так как вы не можете изменять массив во время быстрой итерации.
Параллелизм - слишком сложная тема, чтобы действительно углубляться в неено для быстрого исправления я рекомендую переключить refreshFAQTable на метод, который принимает новый массив в качестве параметра, и изменить код на:
[self performSelectorOnMainThread:@selector(refreshFAQTable:) withObject:arrLoadedData waitUntilDone:YES];
Это, очевидно, позволит избежать каких-либо проблем с основным потоком, работающим намассив при этом заменяется.