【发布时间】:2012-02-07 19:34:36
【问题描述】:
我正在制作一个小型聊天应用程序。在我的应用程序中,我使用的是 NSFetchedResultsController。有 2 个 tableViews,1 个用于大厅,1 个用于聊天室。问题是,每当我进入聊天室时,我都必须等待 NSFetchedResultsController 执行获取并加载所有数据,然后才能开始输入任何内容。我想知道是否可以在后台执行 fetch 或以某种方式让用户在加载最后一条消息之前开始输入。
因此,如果我在 viewDidLoad 方法中设置该部分,我的 UI 就会冻结,直到所有数据都加载完毕:
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
如果我将那段代码设置为单独的方法,然后在后台的 viewDidLoad 中调用该方法
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
tableView 只是没有更新,所以我必须回到第一个 tableView,然后再回来获得任何结果。
谢谢。
任何帮助将不胜感激
更新
我确实尝试了其他几种方法。
方式一:
-(void)reloadTheTable
{
[self.tableView reloadData];
}
-(void)fetchIt
{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
[self performSelectorOnMainThread:@selector(reloadTheTable) withObject:nil waitUntilDone:NO];
[pool release];
}
- (void)viewDidLoad {
//some code
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
//some other code
}
结果:tableView 没有显示任何数据,需要重新打开那个视图控制器
方式2:
- (void)viewDidLoad {
//some code
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
});
//some other code
}
结果:tableView 更新,但 UI 冻结
方式3:
-(void)fetchIt
{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
}
- (void)viewDidLoad {
//some code
[self performSelectorOnMainThread:@selector(fetchIt) withObject:nil waitUntilDone:NO];
//some other code
}
结果:UI 冻结,表格视图更新。
正如我在某处读到的,所有与 UI 相关的事情都必须在主线程上完成。但我仍然不知道如何在不冻结 tableView 的情况下做到这一点。
感谢您的阅读。
感谢任何帮助
【问题讨论】:
-
我想你在找THIS。
-
@Kjuly 谢谢,但它仍然有点反应迟钝。使用 dispatch_async(dispatch_get_main_queue(), ^{ ... });
-
不要使用
dispatch_get_main_queue这也会阻塞你的应用,因为UI在主线程中运行,你需要在其他线程中获取数据。 -
@Kjuly 我确实尝试了 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) 和 dispatch_queue_create(nil, nil),但是 tableView 只是没有更新
-
@Novary 更新表视图?试试
[tableView reloadData];。 :)
标签: iphone ios user-interface core-data nsfetchedresultscontroller