配列の値変更を検知するObserveEveryValueChangedを、Observable.Createで自作

配列内のIsCompletedがtrueになったらイベント発生するように。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;

public class ChangeValueListObservableScene : MonoBehaviour
{
class RequestData
{
public string Url;
public bool IsCompleted;
}
class SampleClient
{
IObservable isCompletedsAsObservable;
public IObservable IsCompletedsAsObservable { get => isCompletedsAsObservable; set => isCompletedsAsObservable = value; }
List requestDatas;
public List RequestDatas { get => requestDatas; set => requestDatas = value; }
public SampleClient()
{
requestDatas = new List();
requestDatas.Add(new RequestData
{
Url = "ttp://example.com",
IsCompleted = false,
});
requestDatas.Add(new RequestData
{
Url = "ttp://example2.com",
IsCompleted = false,
});
isCompletedsAsObservable = Observable.Create(observer =>
{
int i = 0;
foreach (RequestData requestData in requestDatas)
{
int id = i;
requestData.ObserveEveryValueChanged(_ => _.IsCompleted)
.Subscribe(isCompleted =>
{
observer.OnNext(id);
});
i++;
}
return Disposable.Empty;
});
}
public void Response(int id)
{
requestDatas[id].IsCompleted = true;
}
}
void Start()
{
int id = 1;
var sampleClient = new SampleClient();
sampleClient.IsCompletedsAsObservable
.Subscribe(id => {
if (!sampleClient.RequestDatas[id].IsCompleted) return;
Debug.Log("Id=" + id + " Url=" + sampleClient.RequestDatas[id].Url + " IsCompleted=" + sampleClient.RequestDatas[id].IsCompleted);
})
.AddTo(gameObject);
// 5秒後に遅延実行
Observable.Timer(System.TimeSpan.FromSeconds(5))
.Subscribe(_ => {
sampleClient.Response(id);
}).AddTo(gameObject);
}
}