Nov*_*arg 11 iphone user-interface core-data nsfetchedresultscontroller ios
我正在制作一个小型聊天应用.在我的应用程序中,我正在使用NSFetchedResultsController.有2个tableViews,1个用于大厅,1个用于聊天室.问题是每当我进入聊天室时,我必须等待NSFetchedResultsController执行获取并加载所有数据,然后才能开始输入任何内容.我想知道是否可以在后台执行fetch,或者以某种方式让用户在加载最后一条消息之前开始输入.
因此,如果我在viewDidLoad方法中设置该部分,我的UI就会冻结,直到加载所有数据:
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
Run Code Online (Sandbox Code Playgroud)
如果我将该段代码设置为单独的方法,然后在后台的viewDidLoad中调用该方法
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
Run Code Online (Sandbox Code Playgroud)
tableView只是没有更新,所以我必须回到第一个tableView,然后回来获取任何结果.
谢谢.
任何帮助,将不胜感激
更新
我确实尝试了其他一些方法来做到这一点.
方式1:
-(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
}
Run Code Online (Sandbox Code Playgroud)
结果: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
}
Run Code Online (Sandbox Code Playgroud)
结果: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
}
Run Code Online (Sandbox Code Playgroud)
结果:UI冻结,表视图更新.
当我在某处阅读时,必须在主线程上完成与UI有关的所有操作.但是我仍然无法弄清楚如何在不冻结tableView的情况下做到这一点.
谢谢你的阅读.
任何帮助表示赞赏
Kju*_*uly 14
我不确定这是否有用,但你可以尝试一下:
- (void)methodThatloadYourData {
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
}
- (void)viewDidLoad {
//some code
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
^{
[self performSelector:@selector(methodThatloadYourData)];
dispatch_async(dispatch_get_main_queue(),
^{
[self.tableView reloadData];
});
});
//some other code
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7587 次 |
| 最近记录: |