ответ асинхронной обработки фоновой задачи afnetworking при изменении viewcontroller

#objective-c #afnetworking

#objective-c #afnetworking

Вопрос:

Мое приложение позволяет пользователю создавать товар для размещения на сайте электронной коммерции. Пользователь просматривает несколько экранов, добавляя изображения и информацию, пока ему не понадобится создать товар в магазине.

На экране окончательной загрузки отображается UIViewController, использующий AFNetworking, для вызова которого используются две службы:

1) Вызывает веб-службу загрузки изображений и возвращает некоторые идентификаторы. При успешном выполнении он вызывает (2).

2) Вызывает другую службу, используя эти возвращенные идентификаторы как часть запроса.

Этот процесс запускается, когда пользователь нажимает кнопку отправки.

Чего бы я хотел, так это следующего:

Пользователь нажимает кнопку Отправить, и процесс запускается в фоновом режиме Текущая сцена раскадровки возвращается на начальный экран, чтобы позволить пользователю создать другой элемент, пока предыдущий все еще выполняется.

Поскольку код для вызовов службы и обработка ответов от них находятся в UIViewController, после изменения сцены UIViewController больше не будет выполняться в стеке, так что же произойдет с ответом службы и т.д.?

Если я создам отдельный класс для выполнения работы, я потеряю ссылку на объект при изменении сцены. Если метод все еще обрабатывает, будет ли это сбор мусора?

Должен ли я вставлять это в фоновый поток, используя Grand Central Dispatch?

Комментарии:

1. Почему бы вам не создать отдельный класс, который управляет сетью как одноэлементный? У него всегда будет ссылка на объект.

Ответ №1:

Для получения более подробной информации, вот пример.

Обычно у меня есть класс с именем NetWrapper, который управляет всем, что связано с сетью.

.h

 @interface NetWrapper : NSObject
  (instancetype)shared;

#pragma mark - APIs
- (void)requestVersion;
@end
  

.m

 static NetWrapper *_netWrapper;
@implementation NetWrapper

  (instancetype)shared
{
    if(_netWrapper == nil)
    {
        _netWrapper = [[NetWrapper alloc] init];
    }
    return _netWrapper;
}

#pragma mark - APIs
- (void)requestVersion
{
    // do something
}
  

Если у вас есть подобный одноэлементный класс, вы всегда можете иметь один и тот же экземпляр с

 [NetWrapper shared]
  

и вызовите метод экземпляра, как показано ниже.

 [[NetWrapper shared] requestVersion];
  

Комментарии:

1. отличное спасибо, это на самом деле то, о чем я тоже думал, но не был точно уверен, как применить это к objective c. ценю усилия в ответе!!!