/// <summary> /// SpacomicMainViewModelクラスの新しいインスタンスを生成します。 /// </summary> public SpacomicMainViewModel() { // AppオブジェクトからModelを取得します。 spacomicRSSCollectionModel = (App.Current as App)?.SpacomicRSSCollectionModel; // Modelの参照の取得に失敗したら、例外をスローします。 if (spacomicRSSCollectionModel == null) { throw new Exception($"Failed to get reference of Model's instance on {GetType().ToString()}"); } // プロパティの変更を通知します。 spacomicRSSCollectionModel.PropertyChanged += (sender, e) => PropertyChanged?.Invoke(sender, e); // RSSフィードの取得が完了したことをView側に通知します。 spacomicRSSCollectionModel.GetRSSCompleted += (sender, e) => { // RSSフィード取得中のフラグをオフにします。 IsProgress = false; NotifyPropertyChanged(nameof(CanSwitchComicView)); // RSSフィード取得完了したことをView側に通知します。 GetRSSCompleted?.Invoke(this, e); }; // すぱこーRSSフィードの最新話が見つかったことを通知します。 spacomicRSSCollectionModel.NewRSSContentsFound += (sender, e) => NewRSSContentsFound?.Invoke(sender, e); }
/// <summary> /// すぱこーRSSフィードの新しい話がWeb上にあるかどうか判別します。 /// </summary> private async Task CheckNewContents() { // 最新話が見つかったフラグ bool newContentsFound = false; try { foreach (var sause in spacoSause) { string url = $"{sause.RSSFeedURL}?count=1"; // このforeachブロック専用のCancellationTokenを生成します。 using (CancellationTokenSource cancellationTokenSourceInstant = new CancellationTokenSource()) { // タイムアウトは5秒間に設定します。 cancellationTokenSourceInstant.CancelAfter(5000); using (XmlReader reader = await Task.Run(() => SpacoRSSClient.GetXmlReaderAsync(url, cancellationTokenSourceInstant.Token))) { SpacoRSSReader srr = await Task.Run(() => SpacoRSSReader.LoadAsync(reader, cancellationTokenSourceInstant.Token)); // 最新話のVolumeが、Items上の同じソースの最新のVolumeより大きい時、フラグをオンにします。 if (srr.Items.First().Volume > Items.Where(_ => _.Type == sause.Type).Max(_ => _.Volume)) { newContentsFound = true; } } } } // 最新話が見つかったら、ViewModelに通知します。 if (newContentsFound) { NewRSSContentsFound?.Invoke(this, new EventArgs()); } } catch (Exception) {} }