Есть ли способ извлечь какие-либо данные из контекста, в котором моя задача была создана для делегата? - PullRequest
0 голосов
/ 30 августа 2018

Я создаю задачу для загрузки изображения в фоновом режиме внутри функции, и у меня есть объект notification в том же контексте. Я хочу получить этот notification объект, когда вызывается делегат didFinishDownloadingToURL. Есть ли способ, которым я могу это сделать?

Я создаю задачу следующим образом:

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"imageDownloadSession"];
[sessionConfig setDiscretionary:YES];
[sessionConfig setSessionSendsLaunchEvents:YES];

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];

NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithURL:notification.imageRemoteURL];

А это мой делегат:

-(void)URLSession:(NSURLSession *)session
       downloadTask:(NSURLSessionDownloadTask *)downloadTask
       didFinishDownloadingToURL:(NSURL *)location {

    // I want to access the notification object here

}

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете просто сохранить в уведомлении свойство в классе, который вы используете как NSURLSessionDownloadDelegate. Поэтому, когда вызывается downloadTaskWithURL, вы можете получить доступ к этому свойству. В качестве альтернативы вы можете создать другой класс, который содержит уведомление как свойство экземпляра и действует как делегат. Если у вас есть несколько задач загрузки, вы можете хранить их в массиве.

Например:

...
self.downloadDelegate = [[SessionDownloadDelegate alloc] init];
downloadDelegate.notification = notification

//Now use the downloadDelegate instead of self
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:downloadDelegate delegateQueue:nil];
...

@interface SessionDownloadDelegate: NSObject<NSURLSessionDownloadDelegate>
    @property (strong, nonatomic) NSObject *notification;
@end

@implementation SessionDownloadDelegate
- (void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(nonnull NSURL *)location {
//    access the notification object
//    self.notification
}
@end
...