1

Я являюсь любопытным новичком в области разработки iOS. Я загружаю информацию из вызова API, и во время загрузки я хочу показать «загрузочный счетчик».Показание загрузки spinner на другую тему

Все работает, но я получаю это предупреждение на журнал: «Получение веб-замок из потока, отличного от основного потока или веб-нить UIKit не должен вызываться из вторичного потока.»

Это мой код:

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
spinner.center = CGPointMake(160, 150); 
spinner.hidesWhenStopped = YES; 
[self.view addSubview:spinner]; 
[spinner startAnimating]; 
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

dispatch_queue_t downloadQueue = dispatch_queue_create("downloader", NULL); 



dispatch_async(downloadQueue, ^{ 
    NSString *url = [NSString stringWithFormat:@"https://www.***********?q=%@",[self.searchBar.text urlEncode:NSUTF8StringEncoding]]; 
    NSURL *googleURL = [NSURL URLWithString:url]; 
    NSData *jsonData = [NSData dataWithContentsOfURL:googleURL]; 

    NSError *error = nil; 
    NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
    for (NSDictionary *items in [dataDict objectForKey:@"items"]) { 
     Book *book = [Book bookWithTitle:[[items objectForKey:@"volumeInfo"] objectForKey:@"title"]]; 
     book.authors = [[[items objectForKey:@"volumeInfo"] objectForKey:@"authors"] objectAtIndex:(0)]; 

     [self.rowsInSection addObject:book]; 

    } 



    dispatch_async(dispatch_get_main_queue(), ^{ 
     [spinner stopAnimating]; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     [[self myTableView]reloadData]; 
     [self.view endEditing:YES]; 
    }); 

}); 

Я попытался переключить два потока, но это не сработало. Любая идея?

Спасибо! А.

EDIT:

Я решил предупреждение. В основном это происходило, потому что я обращался к «self.searchBar.text» внутри другого потока. Чтобы решить эту проблему, я использовал локальную переменную, чтобы ее сохранить, а затем использовать эту переменную в потоке. Это все еще немного сбивает меня с толку, но по крайней мере у меня нет никаких ошибок или предупреждений.

Спасибо всем за комментарии/ответы и помощь!

А.

+0

предупреждение не следует принимать слишком легкомысленно, но, скорее всего, он никогда не будет реальной проблемой. Если вас это беспокоит, вы всегда можете использовать NSAutoReleasePool и NSThread. – ApolloSoftware

+0

Спасибо! Я посмотрю на них. – Andrea

+0

Что такое 'self.rowsInSection'? –

ответ

0

У меня было такое предупреждение случилось со мной, и это было, потому что я изменял вертушка атрибуты внутри блока, как вы.

Я исправил его, перемещая любые вызовы «прядильщика» вне блока. Я только что создал метод остановки счетчика. Что-то вроде:

__weak YourClass blockSelf = self; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [blockSelf spinnerStop:spinner]; //REPLACED THIS LINE 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [[blockSelf myTableView]reloadData]; 
    [blockSelf endEditing:YES]; 
}); 

Метод

-(void)spinnerStop:(UIActivityIndicatorView *)activityView { 
    [activityView stopAnimating]; 
    [activityView removeFromSubView]; 
} 
+0

Большое спасибо за это, это не решило мое предупреждение, но это еще один хороший способ сделать это. В конце концов, я все еще учусь. – Andrea