4
respostas

Sqlite Assíncrono

Boa tarde

Estou usando o sqlite de forma assíncrona, porém estou com dificuldades em popular a listview.

O Código a seguir está no repository.

public async Task<ICollection<T>> FindAll()
{
            return await _connection.Table<T>().ToListAsync();
}

Agora no construtor da minha ViewModel estou tentando acessar este método, porém como ele retorna uma Task devo usar async/await. Tentei colocar no contrutor mas o visual studio reclamou.

Gostaria de saber a forma correta de popular a listview com estes dados de forma assíncrona para que não bloqueie a Thread principal.

4 respostas

Oi Fabiano

Pode postar aqui o código da ViewModel que consome o método? E qual erro aparece no Visual Studio?

Repositório

public async Task<ICollection<T>> FindAll()
{
    return await _connection.Table<T>().ToListAsync();
}

Service

public async Task<ICollection<Medicamento>> FindAllAsync()
{
    return await _repository.FindAll();
}

O erro que ocorre no construtor da ViewModel é porque ele não pode chamar um método assíncrono.

Estou fazendo assim para não bloquear a Thread principal. Quero que abra a tela que contem a listView sem delay.

Se eu usar o .Result, não vai ficar síncrono?

A dúvida é, como carregar estes dados de maneira assíncrona na listView, sem bloquear a Thread principal?

Alguma novidade?

Cuidado com o .Result. Ele vai travar a Thread da UI. No construtor ele pode até "capotar" a aplicação. Outro ponto, não faz sentido invocar métodos assíncronos no construtor. Geralmente o que podemos fazer é criar um método público e assíncrono na viewmodel chamado OnInitialize por exemplo, e na View a gente invoca ele. Um exemplo seria isso:

    public partial class EventsPage : ContentPage
    {
        private readonly ViewModels.EventsViewModel _viewModel = new ViewModels.EventsViewModel();
        public EventsPage()
        {
            InitializeComponent();
            this.BindingContext = this._viewModel;
        }

        protected override async void OnAppearing()
            => await this._viewModel.OnInitialize();
    }

Espero ter ajudado :)