private async Task InitTableViewAsync() { // delay is need to delay UI thread freezing while TableNode items are loaded // thus previous screen will not be frozen await Task.Delay(1); Table.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive; Table.TranslatesAutoresizingMaskIntoConstraints = false; Table.BackgroundColor = UIColor.FromRGB(245, 245, 245); Table.AddGestureRecognizer(new UITapGestureRecognizer((obj) => Input.TextView.ResignFirstResponder())); var tableSource = new GroupedTableDataSource <DateTimeOffset, ChatMessageViewModel>( ViewModel.MessagesList.Messages, Table, viewModel => GetMessageNode(viewModel), TableNode.Inverted); Table.EstimatedRowHeight = MinCellHeight; Table.SeparatorStyle = UITableViewCellSeparatorStyle.None; _dataSourceRef = WeakReferenceEx.Create(tableSource); TableNode.DataSource = tableSource; TableNode.Delegate = _tableDelegate; TableNode.SetTuningParameters(new ASRangeTuningParameters { leadingBufferScreenfuls = 1, trailingBufferScreenfuls = 1 }, ASLayoutRangeType.Display); TableNode.SetTuningParameters(new ASRangeTuningParameters { leadingBufferScreenfuls = 1, trailingBufferScreenfuls = 1 }, ASLayoutRangeType.Preload); TableNode.ReloadData(); TableNode.LeadingScreensForBatching = 3; }