PCL中的HttpClient调用无法在iOS

时间:2017-06-09 21:52:59

标签: ios rest http xamarin client

我在Android / iOS / C#方面很有经验,但Xamarin / VS for Mac的新手从这里开始......

我的解决方案中有两个项目。一个iOS应用程序项目和一个PCL。 希望能够在PCL中编写我的网络/ REST层。

我遇到了一大堆运行时问题。这是我的PCL中的代码。

        public static OverwatchAPI CreateClient(HttpClient c)
        {
            var shared = new OverwatchAPI
            {
                client = c
            };
            return shared;
        }

        public async Task<Stats> GetStats(string username)
        {
            var stats = new Stats();
            var uri = new Uri(string.Format("{0}{1}{2}", baseURL, "/stats/xbl/us/", username));
            var response = await client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                stats = JsonConvert.DeserializeObject<Stats>(content);
            }
            return stats;
        }

在我的iOS项目中,我将其设置如下。

    OverwatchAPI api = OverwatchAPI.CreateClient(new HttpClient(new CFNetworkHandler()));
    ...
    public Stats GetStats(string playerName)
    {
        Stats stats = api.GetStats(playerName).Result;
        return stats;
    }

它只是挂在api.GetStats上,我无法弄清楚为什么或要看什么来进一步研究这个问题。我也不知道要问自己什么问题,以便更好地推理它。

卡住。任何指针都会很棒 - 谢谢!

1 个答案:

答案 0 :(得分:1)

使用async&amp; await获取任务Result而不是访问该媒体资源。使异步方法同步运行会阻止您在移动APP中绝对不需要的UI线程(对REST服务的调用可能需要一两秒钟,并且此时UI将被阻止)

使用async / await您必须调整iOS方法,以便像PCL方法一样返回Task<Stats>