Должен ли я создать новый NSURLSessionTask после обработки ошибки HTTP? - PullRequest
0 голосов
/ 19 марта 2019

В моем приложении Xamarin.iOS я хочу повторить попытку загрузки после сбоя из-за ошибки http.

Но я не уверен, как реализовать.

Я думал, что мне следует просто продолжать создавать новую задачу каждый раз, когда она завершается с ошибкой http? Это правильный способ реализации?

NSUrlSessionTaskDelegate:

    public async override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error)
    {
        if (task.Response != null)
        {
            if (task.Response is NSHttpUrlResponse httpResponse)
            {
                if (httpResponse.StatusCode == 200)
                {
                    //some clean up logic here
                }
                else if (httpResponse.StatusCode > 400 && httpResponse.StatusCode < 500)
                {
                    //what to do to upload again?
                }
                else
                {
                    var applicationException = new ApplicationException("Server returned 500");
                    Crashes.TrackError(applicationException);
                }
            }
        }
    }

AppDelegate:

    public NSUrlSession InitBackgroundSession()
    {
        string identifier = "com.uba.BookingUploadBackgroundSession";
        INSUrlSessionDelegate backgroundUploadSessionDelegate = new BackgroundBookingUploadSessionDelegate();

        using (var config = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(identifier))
        {
            config.HttpMaximumConnectionsPerHost = 4;
            config.TimeoutIntervalForResource = 300.0; //5mins
            return NSUrlSession.FromConfiguration(config, backgroundUploadSessionDelegate, new NSOperationQueue());
        }
    }

    //gets called when user taps Submit from ViewController
    public void UploadFile(BookingDTO newBookingDTO)
    {
        //logic to create NSMutableUrlRequest omitted

        var uploadTask = session.CreateUploadTask(request, NSUrl.FromFilename(filename));
        uploadTask.TaskDescription = newBookingDTO.ClientId;  //we need the booking id so we can delete it later
        uploadTask.Resume();
     }

Я приму любой ответ на C #, Swift или Objective-C

1 Ответ

1 голос
/ 20 марта 2019

NSURLSessionTask имеет четыре различных состояния. Как показано на следующем рисунке.enter image description here

Когда загрузка завершится. При успешном завершении или сбое состояния станут Завершено . И свойство CurrentRequest будет иметь значение null,Вы можете обработать только Ответ задачи. Так что. Я думаю, что вы можете использовать тот же сеанс, но вам нужно создать новую задачу. Вы можете использовать Уведомление для отправки сообщения.

NSUrlSessionTaskDelegate:

public async override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error)
{
    if (task.Response != null)
    {
        if (task.Response is NSHttpUrlResponse httpResponse)
        {
            if (httpResponse.StatusCode == 200)
            {
                //some clean up logic here
            }
            else if (httpResponse.StatusCode > 400 && httpResponse.StatusCode < 500)
            {
                //send notification here 
                NSNotification notification = NSNotification.FromName("UploadFail",null,null);
                NSNotificationCenter.DefaultCenter.PostNotification(notification); 

            }
            else
            {
                var applicationException = new ApplicationException("Server returned 500");
                Crashes.TrackError(applicationException);
            }
        }
    }
}

А в AppDelegate.cs добавить уведомление в методе FinishedLaunching

 NSNotificationCenter.DefaultCenter.AddObserver(this,new Selector("UploadAgain"),new NSString("UploadFail"),null);

[Export("UploadAgain")]
void UploadAgain()
{
   //call your upload code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...