0

Downloader クラスに 2 つの非同期ダウンロードがあります。基本的に、コードは最初に単純な http ベースの API リクエストを作成して URL を含むデータを取得し、次にこの URL を使用して画像をダウンロードします - 最後の関数呼び出し - Test(adImage) は UIImage をメインの関数に戻そうとしますダウンロードした画像で UIImageView を更新できるように、ViewController クラス。これを行おうとすると、次の行で ArgumentNullException が発生します

string result = System.Text.Encoding.UTF8.GetString (e.Result);

これは、メイン UI スレッドを使用してメイン VC を更新する必要があり、別の非同期スレッドで実行されているこのオブジェクトから実行できないためだと思います。テスト関数を取り出すと、すべてが正常に実行され、イメージがダウンロードされますが、何にも使用されません。

画像を mainVC に戻し、メイン UI スレッドで画像を更新するにはどうすればよいですか?

(これは私が以前に尋ねた質問に関連していますが、以前は完全に間違ったツリーを吠えていたと思うので、別の方法で問題を再表現したほうがよいと感じました)。

public class Downloader : IImageUpdated {

        UIImage adImage;
        Manga5ViewController mainVC;

        public void DownloadWebData(Uri apiUrl, Manga5ViewController callingVC)
        {
            mainVC = callingVC;
            WebClient client = new WebClient();
            client.DownloadDataCompleted += DownloadDataCompleted;
            client.DownloadDataAsync(apiUrl);
        }

        public void DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
        {
            string result = System.Text.Encoding.UTF8.GetString (e.Result);
            string link = GetUri(result);
            Console.WriteLine (link);
            downloadImage(new Uri (link));
        }

        public void downloadImage (Uri imageUri) {

            var tmp_img = ImageLoader.DefaultRequestImage (imageUri, this);
            if (tmp_img != null)
            {
                adImage = tmp_img;
                Console.WriteLine ("Image already cached, displaying");
                Console.WriteLine ("Size: " + adImage.Size);
                mainVC.Test (adImage);
            }
            else
            {
                adImage = UIImage.FromFile ("Images/downloading.jpg");
                Console.WriteLine ("Image not cached.  Using placeholder.");
            }
        }

        public void UpdatedImage (System.Uri uri) {
            adImage = ImageLoader.DefaultRequestImage(uri, this);
            Console.WriteLine ("Size: " + adImage.Size);
            mainVC.Test (adImage);
        }

    ....
}
4

1 に答える 1