2017-02-13 91 views
0

我想創建一個幫助器類來處理我的應用程序中的Geocoding和ReverseGeoCoding。Xamarin Forms GetAddressesForPositionAsync

我的挑戰是下面這行代碼實際上並沒有等待調用的結果。

var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 

在檢索地址結果之前,控制返回到調用事件。任何幫助如何使這項工作將不勝感激。

幫助類代碼:

using System.Linq; 
using Xamarin.Forms.Maps; 

namespace MapProblems 
{ 
    public class MapHelper 
    { 
     private Geocoder iobj_Geocoder; 
     public string Address { get; set; } 

     public MapHelper() 
     { 
      iobj_Geocoder = new Geocoder(); 
     } 

     public async void GeoCodeAddress(Position pobj_Position) 
     { 

      var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 

      Address = possibleAddresses.ToList()[0]; 
     } 

    } 
} 

調用助手類C#文件主頁:

using System; 
using System.Diagnostics; 
using Xamarin.Forms; 
using Xamarin.Forms.Maps; 
namespace MapProblems 
{ 
    public partial class MainPage : ContentPage 
    { 
     MapHelper iobj_MapHelper; 
     public MainPage() 
     { 
      InitializeComponent(); 
      iobj_MapHelper = new MapHelper(); 
      this.Appearing += MainPage_Appearing; 

     } 

     private async void MainPage_Appearing(object sender, EventArgs e) 
     { 
      Device.BeginInvokeOnMainThread(() => 
      { 
       iobj_MapHelper.GeoCodeAddress(new Position(38.9047, -077.0310)); 
      } 
      ); 

      Debug.WriteLine("Address: " + iobj_MapHelper.Address); 
     } 
    } 
} 

所以這個例子中的最終結果是Address是任何空字符串時的Debug.WriteLine代碼執行。

任何援助將不勝感激。

回答

1

因爲您的GeoCodeAddress方法是異步無效的,所以您的代碼無法知道它何時完成。嘗試使它成爲一個異步任務:

public async Task<string> GeoCodeAddress(Position pobj_Position) 
{ 
    var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 
    return possibleAddresses.ToList()[0]; 
} 

然後就可以調用它像這樣:

private async void MainPage_Appearing(object sender, EventArgs e) 
{ 
    var address = await iobj_MapHelper.GeoCodeAddress(new Position(38.9047, -077.0310)); 
    Debug.WriteLine("Address: " + address); 
} 

此外,還要確保你的try/catch在異步void的方法,在有例外會崩潰的應用程序,如果他們去處理。

+0

我已經嘗試了你的建議,但它不起作用,但我會再試一次並讓你知道。 –

+0

OK,確實有效,它引發了我提交給MS的缺陷。對於大家的知識,如果您在Windows Phone 8.1模擬器上運行上述代碼,則會返回1個地址。如果您在Windows 10移動模擬器上運行它,則會返回零地址。我創建的應用程序是Windows Phone 8.1應用程序的FYI。 –