2012-06-02 2 views
0

Я много запроса на сервер:Это правильный способ справиться с фоном?

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    [theRequest setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; 

    urlData = [[NSMutableData data] retain]; 
    urlConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 

    if (urlConnection) 
    { 
     finishedLoading = FALSE; 
     while(!finishedLoading) { 
      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
     } 
    } 
    else 
    { 
     [delegate swHttpConnection:self withRequest:urlString failedWithError:nil]; 
    } 

... Когда запрос делается, я получаю обратный вызов. Однако, если я использую приведенный ниже код, селектор не будет вызван:

- (void)request:(MBRequest *)request finished:(NSMutableArray *)resultArray 
{ 
    //Handle resultArray data 

    [self performSelector:@selector(someRandomFunction) withObject: nil afterDelay:1.0f]; 
} 

.. но если я использую приведенный ниже код; Он отлично работает:

- (void)request:(MBRequest *)request finished:(NSMutableArray *)resultArray 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^(void) 
     { 
      //Handle resultArray data 

      [self performSelector:@selector(someRandomFunction) withObject: nil afterDelay:1.0f]; 
     }); 
    }); 
} 

Так что мой вопрос двоякий.

  1. Это правильный способ сделать это? Нужно ли принудительно активировать обратный вызов на mainthred или неправильная логика кода?

  2. Если мне нужно заставить обратный вызов запускаться на mainthred, это правильный код?

Кроме того, сервер код запроса иногда аварии на:

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 

И я получаю это предупреждение Somethings:

Class _NSZombie_NSRunLoop is implemented in both ?? and ?? 

Заранее спасибо

+0

Pelase разместить код функции «обновления» –

+0

Hi , спасибо за ответ. Функция обновления может быть любой. Сейчас его просто пустая функция. Я поместил в него NSLog, и он никогда не называется – BlackMouse

+0

«// Обрабатывает данные resultArray» обрабатывает ли пользовательский интерфейс или какое-то общее хранилище? –

ответ

1

Как обновить пользовательский интерфейс в этом сегменте

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^(void) 
     { 
      //Handle resultArray data 

      [self performSelector:@selector(someRandomFunction) withObject: nil afterDelay:1.0f]; 
     }); 
    }); 

, то он должен быть вызван в потоке пользовательского интерфейса, то да, вы должны сделать это

2

Я не думаю, NSURLConnectionDelegate имеет метод request:finished:? и, посмотрев на свой код, он сглаживается при использовании MBRequest. Если это так, я сильно думаю, что вы должны взглянуть на свою веб-страницу, например, как это сделать с помощью блоков.

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