Ios 从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

我正在实现一个简单的聊天视图控制器。从firebase添加子级时,它会冻结UI,直到给出最后一个子级。奇怪的行为。 下面是代码片段-

-(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条记录。