#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. ценю усилия в ответе!!!