2013-12-16 2 views
0

Я создаю свои собственные протоколы и делегаты, используя AFNetworking 2.0.Создайте собственный делегат и протоколы с использованием AFNetworking 2.0

У меня есть несколько способов показать прогресс загрузки (отлично работает), когда загрузка закончена и когда начнется загрузка.

Проблема: я не знаю, как узнать в другом классе, когда моя загрузка закончена.

У кого-то есть идея? Предложения?

Большое вам спасибо!

Вот мой .h файл:

#import <Foundation/Foundation.h> 

@class MapDownloader; 

@protocol MapDownloaderDelegate <NSObject> 

@optional 

- (BOOL)mapDownloaderWillMapDownload:(MapDownloader *)downloader; 
- (BOOL)mapDownloaderDidMapDownload:(MapDownloader *)downloader; 

- (void)mapDownloader:(MapDownloader *)downloader progressDownloading:(float)progress; 

@end 

@interface MapDownloader : NSObject 

@property (nonatomic, weak) id<MapDownloaderDelegate> delegate; 
@property (nonatomic, strong) NSString *mapName; 

- (void)downloadAsync:(NSString*)mapName; 

@end 

А вот мой .m файл:

@implementation MapDownloader 

- (void)downloadAsync:(NSString *)mapName 
{ 
    if (![self willDownloadMap]) 
     return; 

    self.mapName = mapName; 

    [self startDownload]; 
} 

#pragma mark - 
#pragma mark Private Methods 

- (void)startDownload 
{ 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

    NSURL * URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kUrlWalk, self.mapName]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
    NSProgress *progress; 

    NSURLSessionDownloadTask *downloadTask = 
    [manager downloadTaskWithRequest:request 
          progress:&progress 
         destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
          return [self filePath]; 
         } 
        completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
         [self downloadComplete]; 
        }]; 

    [downloadTask resume]; 

    [progress addObserver:self 
       forKeyPath:@"fractionCompleted" 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

} 

- (void)downloadProgress:(double)progress 
{ 
    [self progressDownloading:progress]; 
} 

- (void)downloadComplete 
{ 
    [self didDownloadMap]; 
} 

#pragma mark Helpers 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSProgress *progress = (NSProgress *)object; 
    [self downloadProgress:progress.fractionCompleted]; 
} 

- (NSURL*)documentPath 
{ 
    return [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]; 
} 

- (NSURL*)mapsPath 
{ 
    NSURL *documentsDirectoryPath = [self documentPath]; 

    return [documentsDirectoryPath URLByAppendingPathComponent:kDirMap]; 
} 

- (NSURL*)filePath 
{ 
    NSURL *mapsPath = [self mapsPath]; 

    return [mapsPath URLByAppendingPathComponent:[NSString stringWithFormat:@"%@", self.mapName]]; 
} 

#pragma mark - Events 

- (BOOL)willDownloadMap 
{ 
    if ([self.delegate respondsToSelector:@selector(mapDownloaderWillMapDownload:)]) 
     return [self.delegate mapDownloaderWillMapDownload:self]; 

    return YES; 
} 

- (void)didDownloadMap { 

    if ([self.delegate respondsToSelector:@selector(mapDownloaderDidMapDownload:)]) 
     [self.delegate mapDownloaderDidMapDownload:self]; 
} 

- (void)progressDownloading:(float)progress { 

    if ([self.delegate respondsToSelector:@selector(mapDownloader:progressDownloading:)]) 
     [self.delegate mapDownloader:self progressDownloading:progress]; 
} 

@end 
+0

Вы можете использовать 'делегат method' или Notification центр , –

+0

Как я могу это сделать? Потому что, когда загрузка закончена, корректно вызывается метод «(void) didDownloadMap». Но я не знаю, как продолжить использовать это в других классах моего приложения:/ – Lapinou

ответ

3

Пожалуйста, обратитесь к NSNOtification Class. Пожалуйста, позвоните это в ViewDidLoad метод класса, где вы хотите знать, является ли загрузка закончена

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finished:) name:@"requestfinishes" object:nil]; 

и называют это (void)didDownloadMap метод

[[NSNotificationCenter defaultCenter] postNotificationName:@"requestfinishes" object:nil userInfo:nil]; 
+0

Очень приятно! Он отлично работает! Большое спасибо! Теперь я понимаю, как это работает :) – Lapinou

Смежные вопросы