Получил одноэлементный класс, так называемый RequestManager, который обрабатывает запросы, сделанные разными модулями и фоновые задачи моего приложения.Передача NSURLSession: Как реализовать собственный класс SessionDelegate соответственно?
@interface RequestFactory : NSObject
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender;
...
@end
Затем я получил еще один класс, так называемый SessionDelegate, который будет обрабатывать все обратные вызовы во время запроса.
@interface SessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate>
@property (weak, nonatomic) id <RequestFactoryDelegate> delegate;
@end
Моя идея заключается в том, чтобы инкапсулировать функции в этих классах, чтобы не перегружать свои классы, потому что мне нужно много вспомогательных классов с CommonCrypto и так далее.
Поэтому я быстро установил код RequestFactoryDelegate для отправки полученных данных отправителю, который инициировал запрос на отправку.
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender
{
self.sessionDelegate.delegate = sender;
NSMutableURLRequest *request = //create the request here
NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithRequest:request];
[dataTask resume];
}
Ну, это работает, если у меня есть объект, назовем его senderA, который посылает запросы, потому что набор делегата всегда сам senderA.
Проблема возникает с другим объектом, например. senderB, который отправляет запросы - даже в одно и то же время - но очень скоро после отправки отправителя.
- (void)foo
{
[requestFactory requestDataWith:token
id:id
sender:senderA]; // let's assume this takes 20s
[requestFactory requestDataWith:token
id:id
sender:senderB]; // let's assume this takes 1s
}
Поскольку запрос senderA все еще продолжается, senderB устанавливает делегата к нему, и что происходит, функция Делегат senderB запускается дважды.
<senderB>
<senderB>
Ну ... мне действительно нужно реализовать собственный делегат (или не в том же классе, что и RequestFactory или нет), но, как я обрабатывать методы обратного вызова, так что я могу правильно ответить на любой senderA или отправитель?
Моя последняя идея состоит в том, чтобы переопределить класс NSURLSessionTasks и реализовать собственное свойство делегирования или заблокировать свойство или что-то еще.
Большое спасибо заранее.
Я думаю, что стоит уточнить, что единственный делегат объекта NSURLSession ДОЛЖЕН обрабатывать ВСЕ задачи. Кроме того, 'NSURLSessionTask' не может быть подклассом, а также не имеет такого свойства пользовательского контекста. ИМХО, это недостаток дизайна, но, увы, я не Apple. Ваш дизайн должен учитывать это. – CouchDeveloper
TBH Мне очень нравится этот шаблон дизайна NSURLSession, так как я знаю, как правильно его обрабатывать. Идея, что все задачи используют один объект сеанса, действительно крут, преимущества вы можете прочитать, проверяя видео WWDC2013. – Kuno
Тогда почему вы спросили? Ну, в любом случае - проблема НЕ в том, что есть сеанс и одна или несколько задач сеанса. На самом деле это хорошее разделение. Я имею в виду именно то, где у вас были проблемы. Вы можете решить это несколькими способами. Использование словаря, как и вы, является жизнеспособным решением, но я считаю его «взломом» из-за ограничений, предоставляемых API. Тем не менее, я делаю то же самое;) – CouchDeveloper