Изтегляне на данни и асинхронна обработка с NSURLSession

Използвам NSURLSession за изтегляне на xml файлове и след това искам да направя различна обработка на тези файлове, като например анализирането им:

-(void)parseFeed:(NSURL *)url
{
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];

    NSURLSessionDataTask* task = [FeedSessionManager.sharedManager.session dataTaskWithRequest:request completionHandler:^(NSData* data, NSURLResponse* response, NSError* error)
                                  {
                                      Parser* parser = [[Parser alloc] initWithData:data];

                                      [self.feeds addObjectsFromArray:[parser items]];

                                  }];

    [task resume];
}

Обектът на анализатора ще анализира xml файла с помощта на NSXMLParser. parseFeed:(NSURL*)url се извиква от ViewController:

Downloader* downloader = [[Downloader alloc] init];
[downloader parseFeed:[NSURL URLWithString:@"http://www.engadget.com/tag/features/rss.xml"]];
NSArray* items = [downloader feeds];

Ето как създавам обекта NSURLSession:

-(id)init
{
    if(self = [super init])
    {
        _session = [NSURLSession sessionWithConfiguration:FeedSessionConfiguration.defaultSessionConfiguration delegate:self delegateQueue:nil];
    }

    return self;
}

Разбира се, този подход не работи за мен. В метода parseFeed искам да изчакам, докато всички данни бъдат изтеглени и обработени. Само тогава искам да получа достъп до масива self.feeds в ViewController.

Може ли някой да ме насочи в правилната посока да направя това? Или може би да ме насочите към различен подход?


person Adrian    schedule 27.12.2013    source източник
comment
Защо не използвате опашката за операции за изтегляне и след като получите пълен отговор за изтегляне от делегата, можете да започнете да ги анализирате и най-доброто нещо, което имате контрол върху изтеглянето като приоритет, пауза и отмяна   -  person Retro    schedule 27.12.2013
comment
@Retro: благодаря за предложението, можете ли да предоставите и пример за това?   -  person Adrian    schedule 27.12.2013


Отговори (1)


Използвах ASIHTTPRequest, но вече не се поддържа, но можете да използвате опашката за операции на AFHTTPClient

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:nil];

// Important if only downloading one file at a time
[client.operationQueue setMaxConcurrentOperationCount: 1];

NSArray *videoURLs; // An array of strings you want to download

for (NSString * videoURL in videoURLs) {

    // …setup your requests as before

    [client enqueueHTTPRequestOperation:downloadRequest];
}
person Retro    schedule 27.12.2013