UnityからTwitterAPIを呼ぶ。UniRxを使って。(2016/9/28追記あり)

## Twitterアイコン画像をUnityで表示する

Twitter API でタイムラインを持ってくるのだが、そのタイムライン中に含まれているアイコン画像のURLを使って、ランタイムで読み込んで画面に表示してみる。

まず、https://api.twitter.com/1.1/statuses/home_timeline.json を使えば、TwitterタイムラインのJSONが返ってくる。それをパースすると、複数のユーザー情報が集まる。そしてその中のユーザーごとのアイコンのURLを一個一個呼び出して、画像に貼るってことをすればいけると。

## ソース

というわけで、一部ソースを抜粋すると、以下のようになる。

```C#
ObservableWWW.Get(url, headers)
	.OnErrorRetry((System.Exception ex) => Debug.LogError(ex), System.TimeSpan.FromSeconds(3))
	.Select(jsonText =>
		{
			IList<object> tlList = Json.Deserialize (jsonText) as IList<object>;
			string filePath = "";
			foreach( var oneLine in tlList ) {
				var obj = oneLine as Dictionary<string, object>;
				var user = obj["user"] as Dictionary<string, object>;
				filePath = user["profile_image_url_https"] as string;
				Debug.Log( "img:" + filePath );
				// 本来ここで、次のストリームに行きたい
			}
			return filePath;
		})
	.SelectMany(x => ObservableWWW.GetWWW(x))
	.Retry(3)
	.Select(myWWW => 
		{
			// 本来ここでインスタンス化するけど、、、
			myRender.sharedMaterial.mainTexture = myWWW.texture;
		})
	.Subscribe(_ => Debug.Log( "done" ),ex => Debug.LogException( ex )
	);
	

```

なんか違う気がする。

## 課題

上だと１個のURLしかストリームに流せていないが、複数流せないのか？
つまり、イメージとしては以下の感じ。

![IMG_6935.JPG](https://qiita-image-store.s3.amazonaws.com/0/72960/57c4ccdf-62f0-81c7-5215-5e1692e0098e.jpeg)

## とりすーぷさんからのリプライ（2016/9/28追記）

その後、Twitterで[とりすーぷ](https://twitter.com/toRisouP)さんから、超ありがたいリプライが！ありがとうございます！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/warapuri">@warapuri</a> URLの配列に対してSelectでObservableの配列にしたあとに、WhenAllやObservable.Mergeで連結はどうですか？</p>&mdash; とりすーぷ (@toRisouP) <a href="https://twitter.com/toRisouP/status/780977943308668929">2016年9月28日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/warapuri">@warapuri</a> もっとシンプルにこれでもいいかもしれないです<a href="https://t.co/5Vld5zHTpe">https://t.co/5Vld5zHTpe</a></p>&mdash; とりすーぷ (@toRisouP) <a href="https://twitter.com/toRisouP/status/781032167719731201">2016年9月28日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


あ、


```C#:Twitter2.cs
ObservableWWW.Get(url, headers)
    .OnErrorRetry((System.Exception ex) => Debug.LogError(ex), System.TimeSpan.FromSeconds(3))
    .Subscribe(jsonText =>
        {
            IList<object> tlList = Json.Deserialize (jsonText) as IList<object>;
            foreach(oneLine in tlList) {
                var obj = oneLine as Dictionary<string, object>;
                var user = obj["user"] as Dictionary<string, object>;
                ObservableWWW.GetWWW(user["profile_image_url_https"] as string)
                  .Retry(3)
                  .Subscribe(result => {
                    //ここで処理
                  });
            }
        });
```

<script src="https://gist.github.com/anonymous/63bf75a35948663c7cd6971a2bc035e4"></script>




なるほど！

つまり、Subscribeの中でさらにSubscribeしちゃっていいわけだ。てっきり絶対悪かとおもっていたので、意外な対処法だった。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/warapuri">@warapuri</a> Subscribe in Subscribe はUniRxの作者のneueccさんも場合によっては推奨されているパターンだったりしますね（例外発生時にチェーンが切れない）<a href="https://t.co/jddogSqesV">https://t.co/jddogSqesV</a></p>&mdash; とりすーぷ (@toRisouP) <a href="https://twitter.com/toRisouP/status/781033495221116928">2016年9月28日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


ちゃんと動いた！とりすーぷさん、ありがとうございます！