2017-08-17 15 views
2

我在編寫Xamarin Forms應用程序,當應用程序背景時需要調用REST服務。我應該使用異步/等待還是會導致問題?使用Xamarin iOS上的異步/等待創建背景安全任務

該場景是用戶添加一個新項目,沒有網絡連接並關閉應用程序。我需要重複檢查網絡連接,並在有可用時將新數據發佈到REST服務。更糟糕的是,數據可能包含照片,因此可能需要幾分鐘的時間。

我嘗試的解決方案涉及使用後臺獲取檢查網絡連接,然後啓動後臺安全任務來完成繁重的工作。這是由於代碼在後臺獲取中運行的時間限制爲30秒。

這一切聽起來不錯,我的小測試應用程序似乎工作。我需要幫助的是如何最好地使用async/await來調用REST服務。

下面是一些代碼來展示一下測試程序是做

public override async void PerformFetch(UIApplication application, Action<UIBackgroundFetchResult> completionHandler) 
{ 
    // kick off a long running task 
    await StartLongRunningBackgroundTask(); 

    // this can be NoData, NewData or Failed 
    completionHandler(UIBackgroundFetchResult.NoData); 
} 

public async Task StartLongRunningBackgroundTask() 
{ 
    _backgroundTaskID = UIApplication.SharedApplication.BeginBackgroundTask(() => { 
     // this is called if task times out 
     if (_backgroundTaskID != 0) 
     { 
      UIApplication.SharedApplication.EndBackgroundTask(_backgroundTaskID); 
      _backgroundTaskID = 0; 
     } 
    }); 

    try 
    { 
     var restService = FreshTinyIoCContainer.Current.Resolve<IRestClientService>(); 
     var result = await restService.GetDummyResult(); 

     var messagingService = FreshTinyIoCContainer.Current.Resolve<IMessagingService>(); 
     messagingService.Publish(new GotDataMessage { DataString = $"{result.foo} at {DateTime.Now:G}" }); 
    } 

    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.Message); 
    } 

    UIApplication.SharedApplication.EndBackgroundTask(_backgroundTaskID); 
} 

我需要從PerformFetch 30秒內返回。我不確定是否等待會這樣做,或者我應該同步調用StartLongRunningBackgroundTask。

任何想法?任何人都做過這種事情?

Android上的BTW,我使用的是Firebase作業調度程序,並且運行良好。

回答

2

調用REST服務應該始終異步完成。但如果該通話有機會花費超過30秒的限制,則應使用後臺轉接服務。您可以設置上載/下載以通過配置的NSUrlSession運行。爲了讓你開始看看walk through以及post。你要做的基本上是註冊你的PerformFetch的後臺任務,iOS會安排它運行。

+0

我花了幾天時間調查Background Transfer Service並決定不使用它。我的所有REST代碼都在我從Android和iOS調用的共享服務中。我使用Refit來包裝REST服務,並在那裏有調用和錯誤處理代碼。如果我使用BTS,我將不得不重新編寫所有這些,並使用iOS特定的NSURLSession。我試圖找出如何最好地使用後臺安全任務,因爲這給了我高達600秒來發布我的數據。 –