【问题标题】:Data not loading in UITableView after parsing in background [closed]在后台解析后数据未加载到 UITableView [关闭]
【发布时间】:2014-12-08 15:50:30
【问题描述】:

我在解析 XML 数据时尝试实现活动指示器。

我找到了这个Activity indicator (spinner) with UIActivityIndicatorView 并让它工作。但是,因为我使用的是performSelectorInBackground,当它完成解析时,我的表格视图中没有显示任何数据。

我已经尝试过 [self.tableview reloadData] 并且我已经尝试过 [self.view setNeedsDisplay] 但是,似乎没有任何效果。

如果我离开视图并返回它,所有数据都会出现在 tableview 单元格中。

有什么想法吗?

【问题讨论】:

  • 你试过什么?您如何将数据添加到表格视图中?你能显示所有相关的代码吗?
  • 你应该看看performSelectorOnMainThread
  • @KerrM 我对 RSS 提要的所有解析和检索都发生在我导入视图控制器的文件中。在我的视图控制器中,我这样做:self.rssNews = [[ParseRSSNews alloc] initWithUrl:self.url]; 在解析器文件的 initWithUrl 方法中,我这样做:[self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:url]; 一旦完成解析,我就这样做了:[self performSelectorOnMainThread:@selector(doneParsing) withObject:nil waitUntilDone:NO]; 当我打印出我自己有多少项目时.rssNews(在视图控制器中),它显示为 0。所以,它没有返回数据。
  • 如前所述,您需要在主线程上调用reloadData。
  • @cdstamper 谢谢!我想通了=)

标签: ios objective-c uitableview activity-indicator


【解决方案1】:

你应该打电话

[self.tableview reloadData]

ma​​in 线程中(您可以使用 [NSThread isMainThread] 签入您所在的线程)

你可以的

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
//create background queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
//dispatch in background
dispatch_async(backgroundQueue, ^{
        //execute long operation in background thread
        self.rssNews = [[ParseRSSNews alloc] initWithUrl:self.url];
    //dispatch in main thread after long operation is finish
    dispatch_async(dispatch_get_main_queue(), ^{  [self.tableView reloadData]; });
});

【讨论】:

  • 由于我在单独的文件中解析和检索 RSS 提要,因此我无权访问 self.tableview。我能够在我的视图控制器中做到这一点:[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; dispatch_async(dispatch_get_main_queue(), ^{ self.rssNews = [[ParseRSSNews alloc] initWithUrl:self.url]; [self.tableView reloadData]; }); 但是,网络指示器在解析时不会消失。
  • 谢谢鲍里斯!!这有很大帮助!!!我还添加了在第二个 dispatch_async() 中关闭 networkActivityIndi​​catorVisible。再次感谢您的所有帮助!!! =)
  • 我猜我需要释放调度队列?我尝试在 dealloc,dispatch_release(backgroundQueue); 中执行此操作,但 Xcode 说 ARC 禁止显式发送释放消息 - 所以我猜 ARC 将处理释放调度队列,我不应该为此做任何事情?
  • 找到答案:If your deployment target is iOS 6.0 or Mac OS X 10.8 or later ARC will manage your queue for you. You do not need to (and cannot) use dispatch_retain or dispatch_release if ARC is enabled.参考:stackoverflow.com/questions/8618632/…
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多