2012-04-01 1 views
0

У меня есть таймер, который вызывает новый поток, этот поток вызывает функцию, работающую над парарелой, но когда приложение находится в фоновом режиме через некоторое время, оно замерзает. Мой код следуетNSThread in background IOS

в DidLoad:

timerMusica = [NSTimer scheduledTimerWithTimeInterval:(15) target:self selector:@selector(treadAtualizaMusica) userInfo:nil repeats:YES]; 

... функция, которая вызывает новую тему:

-(void)treadAtualizaMusica{ 
    [NSThread detachNewThreadSelector:@selector(atualizaMusica:) toTarget:self withObject:nil]; 
} 

действие, которое выполняется:

- (void)atualizaMusica:(NSTimer *)aNotification{ 
    NSURL *dataUrl = [NSURL URLWithString:@"http://www.xxxxx.com.br/musica.php"]; 
    NSString *fileString = [NSString stringWithContentsOfURL:dataUrl encoding:NSASCIIStringEncoding error:nil]; 

    NSLog(@"buscando string"); 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     if (fileString == NULL) { 
      autoScrollLabel.text = [NSString stringWithFormat:@"xxxxx"]; 
      autoScrollLabel.textColor = [UIColor whiteColor]; 
      autoScrollLabel.font = [UIFont boldSystemFontOfSize:12 ]; 

     } 
     else{ 
      autoScrollLabel.text = [NSString stringWithFormat:@"%@",fileString]; 
      autoScrollLabel.textColor = [UIColor whiteColor]; 
      autoScrollLabel.font = [UIFont boldSystemFontOfSize:12 ]; 
     } 

    } 
    else{ 
     if (fileString == NULL) { 
      scrollMusica.text = [NSString stringWithFormat:@"xxxxx"]; 
      scrollMusica.textColor = [UIColor whiteColor]; 
      scrollMusica.font = [UIFont boldSystemFontOfSize:12 ]; 

     } 
     else{ 
      scrollMusica.text = [NSString stringWithFormat:@"%@",fileString]; 
      scrollMusica.textColor = [UIColor whiteColor]; 
      scrollMusica.font = [UIFont boldSystemFontOfSize:12 ]; 
     } 
    } 
} 

Я не знаю, если это правильный способ открыть новый поток, но это то, что я нашел в поиске.

Мне нужен этот отдельный поток, потому что моя функция ищет строку на сервере, а соединение пользователя медленное, приложение заблокировано во время этой загрузки. Этот выше код решил эту проблему, но создал еще один, как я упоминал выше, когда приложение находится в фоновом режиме через некоторое время, оно замерзает.

ответ

0

Во время переключения задачи фоновый поток работает в iOS.
Вам нужно попросить разрешения продолжить выполнение еще немного.
Использование

UIApplication beginBackgroundTaskWithExpirationHandler

+0

правы сейчас я исследования. но у вас есть примеры того, как их реализовать? До сих пор я не мог понять метод ... Спасибо! – jucajl

+0

вместо того, чтобы отсоединить поток, вы запускаете свой код в этом блоке методов – CiNN

+0

@ JoãoLuiz вызывает этот метод в '[UIApplication sharedApplication]', снабжающем блок кода продолжения. Если это то, что вызывает путаницу, iOS явно позволяет вам запрашивать небольшое количество дополнительного времени для выполнения какой-то важной дополнительной задачи. Вам не разрешается продолжать работать неограниченно для произвольной цели. – Tommy