2017-06-09 61 views
0

我熟悉的Android/iOS版/ C#,但新Xamarin/VS的Mac在這裏開始工作......的HttpClient調用PCL不是在iOS的

我有我的解決方案兩個項目。 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,我想不通爲什麼還是什麼,以便進一步調查此問題關注一下。我也不知道要問什麼問題才能更好地理解它。

卡住了。任何指針都會很棒 - 謝謝!

+0

一旦所有的字符串部分連接在一起,Uri看起來像什麼? – apineda

+0

https://obscure-bastion-80773.herokuapp.com/stats/xbl/us/Krivanka1它可以很好的作爲捲曲 –

+1

你的問題似乎與'.Result'。看起來像一個線程死鎖。你在哪裏調用'GetStats'方法? – apineda

回答

1

使用async & await獲取任務的Result而不是訪問該屬性。使異步方法同步運行會阻塞您絕對不想在移動APP中使用的UI線程(調用REST服務可能需要一兩秒鐘的時間,並且UI將被阻止)

要利用async/await您必須調整您的iOS方法才能返回Task<Stats>,就像您的PCL方法一樣。

+1

修改方法如下。 'public async void GetStats(string playerName) { var stats = await api.GetStats(playerName); Console.WriteLine(「Stats:{0}」,stats.ToString()); }' –

相關問題