Как сказал Мираж, NSURLConnection предназначен для использования runloop.Вы получаете работающую настройку runloop для вас в главном потоке, но в других потоках, которые вы создаете, runloop должен управляться вручную (в основном вы должны его запускать).
Мой совет - использовать параллельную NSOperation и в методе start проверить, если вы находитесь в главном потоке: если нет, снова вызвать метод start в основном потоке и выручить
-(void)start
{
if ([NSThread mainThread] != [NSThread currentThread]) {
[self performSelectorOnMainThread:@selector(start)];
return;
}
rest of the real code is here ....
}
Другими вариантами (более чистыми, но определенно сложными) является создание операции NSO, которая управляет внутренним циклом выполнения (или предоставленным вызывающей стороной), чтобы асинхронные API-интерфейсы, которым это необходимо (например, NSURLConnection), могли запускаться в потоках, отличных от основного.,
Поиск образца «LinkedImageFetcher» в официальном API: класс QRunLoopOperation делает именно это.