2011-12-26 3 views
0

Я пытаюсь запустить метод в фоновом режиме, но он по-прежнему блокирует программу. Это мой код:Многопоточность в Objective-C

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     self.MessagesList=[[MessagesArray alloc] init]; 

     [self performSelectorInBackground:@selector(backgroundMethod) withObject:nil]; 
    } 


    -(void)backgroundMethod 
    { 
     if ([MessagesList updateFromServer]){ 
      [self.Table reloadData]; 
      CFRunLoopRun(); 
    } 
} 

Хотя updateFromServer посылает запрос HTTP на сервер и ждет ответа, сервер задерживает ответ на 10 секунд, и результат в том, что вся программа задерживается на 10 секунд слишком. Вы можете меня исправить?

Обновление: я добавил строку runloop, но проблема остается прежней. HTTP-запрос является асинхронным, но все же - вся программа ждет, пока сервер не ответит. Это мой метод updateFromServer:

responseData = [NSMutableData data]; 
[self setBaseURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
NSURLRequest *request = 
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
return TRUE; 

Как я могу сделать его асинхронным?

+0

Как насчет использования NSThread? –

+0

Я тоже попробовал. ничего не меняется. спасибо –

ответ

1

Всегда обновляйте пользовательский интерфейс на основной теме, [self.Table reloadData] не обновляет фоновый поток. Как вы отправляете HTTP-запрос? NSURLConnection асинхронно или синхронно?

Если это синхронное соединение, оно блокирует поток, в котором он работает, пока не будет получен ответ.

+0

, когда я запускаю синхронный запрос, он блокирует его. асинхронный просто не запускается (он запускается, если я вызываю его из основного потока, но тогда оператор if блокируется, потому что он ждет ответа). в любом случае - как мне обновить пользовательский интерфейс из основного потока, если мне нужно все время проверять обновления с сервера? –

+0

Из фонового потока вы можете позвонить - [NSObject выполнитьSelectorOnMainThread: withObject: waitUntilDone:] в любом NSObject. Я сделал это во многих местах, чтобы получить большой эффект. –

+0

@AmitHagin, Добавьте цикл запуска для вашего фонового потока асинхронного NSURLConnection. – 0x8badf00d

Смежные вопросы