/// <summary> /// Загрузить порцию элементов. /// </summary> /// <param name="count">Количество элементов для загрузки.</param> public IAsyncOperation <LoadMoreItemsResult> LoadMoreItemsAsync(uint count) { return(Task.Run <LoadMoreItemsResult>(async() => { State = ContentState.Loading; uint resultCount = 0; _canLoad = false; if (count < 20) { count = 20; } else if (count > 60) { count = 60; } var request = new ExecuteGetDialogsRequest() { Count = count, Offset = (uint)Count, PreviewLength = 100 }; var result = await request.ExecuteAsync(); await CoreHelper.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { if (result.Error.ErrorType == VKErrors.None) { _totalCount = (ulong)result.Response.Dialogs.Count; for (int i = 0; i < result.Response.Dialogs.Items.Count; i++) { var dialog = result.Response.Dialogs.Items[i]; if (dialog.IsChat) { this.Add(dialog); continue; } var user = result.Response.Users.First(p => p.ID == dialog.Message.UserID); dialog.Message.Title = user.FullName; this.Add(dialog); } State = Count == 0 ? ContentState.NoData : ContentState.Normal; UpdateCanLoad(); } else { State = ContentState.Error; _canLoad = false; } }); await ServiceHelper.MessagesCacheService.CacheDialogs(this.Take(30).ToList()); #if DEBUG Debug.WriteLine("Total dialogs count: " + this.Count); #endif return new LoadMoreItemsResult { Count = resultCount }; }).AsAsyncOperation <LoadMoreItemsResult>()); }
/// <summary> /// Возвращает коллекцию диалогов по указанным параметрам. /// </summary> /// <param name="offset">Смещение списка.</param> /// <param name="count">Количество элементов.</param> /// <param name="unread">Вернуть только непрочитанные.</param> private async Task <List <VKDialog> > GetDialogsWithParameters(uint offset, uint count, bool unread = false) { var dialogsRequest = new ExecuteGetDialogsRequest { Offset = offset, Count = count, PreviewLength = 60, Unread = unread ? VKBoolean.True : VKBoolean.False }; var dialogsResponse = await dialogsRequest.ExecuteAsync(); if (dialogsResponse.Error.ErrorType != VKErrors.None) { return(null); } if (unread) { totalUnreadCount = dialogsResponse.Response.Dialogs.Count; } else { totalCount = dialogsResponse.Response.Dialogs.Count; } foreach (var user in dialogsResponse.Response.Users) { Service.CachedUsers[user.ID] = user; } List <VKDialog> result = new List <VKDialog>(); var unknownChats = new List <VKDialog>(); foreach (var dialog in dialogsResponse.Response.Dialogs.Items) { dialog.Message.Sender = dialogsResponse.Response.Users.FirstOrDefault(u => u.ID == dialog.Message.UserID); if (dialog.IsChat) { unknownChats.Add(dialog); } else if (dialog.Message.Sender != null) { dialog.Message.Title = dialog.Message.Sender.FullName; dialog.Photos = new ObservableCollection <string> { dialog.Message.Sender.Photo50 }; } result.Add(dialog); } if (result.Count == 0) { return(result); } var usersRequest = new GetChatsUsersRequest { ChatIDs = unknownChats.Select(d => d.Message.ChatID).ToList() }; var usersResponse = await usersRequest.ExecuteAsync(); if (usersResponse.Error.ErrorType != VKErrors.None) { return(null); } foreach (uint chatID in usersResponse.Response.Keys) { var users = usersResponse.Response[chatID]; var dialog = unknownChats.FirstOrDefault(d => d.Message.ChatID == chatID); dialog.Photos = new ObservableCollection <string>(); if (!String.IsNullOrEmpty(dialog.Message.Photo50)) { dialog.Photos.Add(dialog.Message.Photo50); continue; } foreach (var user in users) { dialog.Photos.Add(user.Photo50); Service.CachedUsers[user.ID] = user; } } return(result); }