显示加载微调器在其他线程上

时间:2013-06-26 13:42:16

标签: ios objective-c multithreading grand-central-dispatch uiactivityindicatorview

我对iOS原生开发有点新意。我正在从API调用加载信息,并在加载时我想显示“加载微调器”。

一切正常,但我在日志上收到此警告: “从主线程或网络线程以外的线程获取Web锁定。不应该从辅助线程调用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];
    });

}); 

我试图切换两个线程,但这不起作用。 有什么想法吗?

谢谢! 甲

编辑:

我解决了警告。基本上它发生了,因为我正在访问另一个线程中的“self.searchBar.text”。为了解决这个问题,我使用局部变量来存储它,然后在线程中使用该变量。 这对我来说仍然有点混乱,但至少我没有错误或警告。

感谢大家的意见/答案和帮助!

一个。

1 个答案:

答案 0 :(得分: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];
}