【问题标题】:Showing loading spinner on other thread在其他线程上显示加载微调器
【发布时间】:2013-06-26 13:42:15
【问题描述】:

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

一切正常,但我在日志中收到以下警告: " 从主线程或 web 线程以外的线程获取 web lock。不应从辅助线程调用 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];
    });

}); 

我试图切换两个线程,但没有奏效。 有什么想法吗?

谢谢! A.

编辑:

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

感谢大家的 cmets/answers 和帮助!

一个。

【问题讨论】:

  • 警告不应该掉以轻心,但它很可能永远不会成为一个真正的问题。如果您担心它,您可以随时使用 NSAutoReleasePool 和 NSThread。
  • 谢谢!我会看看那些。
  • self.rowsInSection 是什么?
  • 哪个电话向您发出警告?您是否在辅助线程上调用此方法?
  • @MarcusAdams roewsInSection 是我用于 tableView 的属性,用于设置行数。

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


【解决方案1】:

这个警告发生在我身上,这是因为我正在改变块内部的微调器属性。

我通过将任何“微调器”调用移到块外来修复它。我刚刚创建了一个停止微调器的方法。比如:

__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];
}

【讨论】:

  • 非常感谢,它没有解决我的警告,但这是另一种很好的方法。毕竟我还在学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多