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