Ios 从firebase数据库中添加子项后,它会冻结UI
我正在实现一个简单的聊天视图控制器。从firebase添加子级时,它会冻结UI,直到给出最后一个子级。奇怪的行为。 下面是代码片段-Ios 从firebase数据库中添加子项后,它会冻结UI,ios,objective-c,uitableview,firebase,firebase-realtime-database,Ios,Objective C,Uitableview,Firebase,Firebase Realtime Database,我正在实现一个简单的聊天视图控制器。从firebase添加子级时,它会冻结UI,直到给出最后一个子级。奇怪的行为。 下面是代码片段- -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; chatArray=[NSMutableArray new]; ref=(FIRDatabaseReference *)[[FIRDatabase database] reference]; r
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
chatArray=[NSMutableArray new];
ref=(FIRDatabaseReference *)[[FIRDatabase database] reference];
refHandleForGettingChatInfo=[[ref child:@"Chat"] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot)
{
NSLog(@"New chat");
NSDictionary<NSString *, NSString *> *message = snapshot.value;
[chatArray addObject:message];
dispatch_async(dispatch_get_main_queue(), ^{
[tblChat reloadData];
});
}];
}
#pragma mark - Table View delegates and DataSources
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return chatArray.count;
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString * CellIdentifier =@"ChatTableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
cell.selectionStyle=UITableViewCellSelectionStyleNone;
NSDictionary *message=[chatArray objectAtIndex:indexPath.row];
cell.textLabel.text=[message valueForKey:@"userName"];
cell.detailTextLabel.text=[message valueForKey:@"userMessage"];
return cell;
}
-(void)视图显示:(BOOL)动画
{
[超级视图显示:动画];
chatArray=[NSMutableArray new];
ref=(FIRDatabaseReference*)[[FIRDatabase数据库]引用];
refHandleForGettingChatInfo=[[ref child:@“Chat”]ObserveeEventType:FIRDataEventTypeChildAdded with Block:^(FIRDataSnapshot*快照)
{
NSLog(“新聊天”);
NSDictionary*message=snapshot.value;
[chatArray addObject:message];
dispatch\u async(dispatch\u get\u main\u queue()^{
[tblChat重新加载数据];
});
}];
}
#pragma标记-表视图委托和数据源
-(NSInteger)表视图:(UITableView*)表视图行数节:(NSInteger)节{
返回chatArray.count;
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
静态NSString*CellIdentifier=@“ChatTableViewCell”;
UITableViewCell*单元格=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
如果(单元格==nil)
{
单元格=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
cell.selectionStyle=UITableViewCellSelectionStyleNone;
NSDictionary*message=[chatary objectAtIndex:indexath.row];
cell.textLabel.text=[message valueForKey:@“userName”];
cell.detailTextLabel.text=[message valueForKey:@“userMessage”];
返回单元;
}
Xcode版本:8.3.2
部署目标:10.2
如果有人遇到过同样的问题,请让我知道什么是最适合这种情况的解决方案。谢谢更新答案:
NSOperationQueue *dataQue = [[NSOperationQueue alloc]init];
[dataQue addOperationWithBlock:^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
chatArray=[NSMutableArray new];
ref=(FIRDatabaseReference *)[[FIRDatabase database] reference];
refHandleForGettingChatInfo=[[ref child:@"Chat"] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot)
{
NSLog(@"New chat");
NSDictionary<NSString *, NSString *> *message = snapshot.value;
[chatArray addObject:message];
dispatch_async(dispatch_get_main_queue(), ^{
[tblChat reloadData];
});
});
}];
}];
}];
NSOperationQueue*dataQue=[[NSOperationQueue alloc]init];
[dataQue addOperationWithBlock:^{
[[NSOperationQueue mainQueue]添加操作与块:^{
chatArray=[NSMutableArray new];
ref=(FIRDatabaseReference*)[[FIRDatabase数据库]引用];
refHandleForGettingChatInfo=[[ref child:@“Chat”]ObserveeEventType:FIRDataEventTypeChildAdded with Block:^(FIRDataSnapshot*快照)
{
NSLog(“新聊天”);
NSDictionary*message=snapshot.value;
[chatArray addObject:message];
dispatch\u async(dispatch\u get\u main\u queue()^{
[tblChat重新加载数据];
});
});
}];
}];
}];
我已将我的侦听器代码替换为您的代码,但它仍然挂起。我更新了call ur**reloadata**。在dispatch_get_main_队列中,我认为它将解决您的问题。让我检查NAVEENNothing改进的Naveen,dispatch_get_main_队列()是一个好主意。在主线程中重新加载tableview,但firebase块太快,无法在主线程上处理。我在firebase数据库中有15条记录,它会挂起UI,直到它给出第15条记录。