Вопрос

Я только что начал использовать afnetworking и до сих пор это работало нормально для получения данных из сети.

Но теперь у меня есть список файлов, которые необходимо загрузить на устройство

for(NSDictionary *issueDic in data)
{
    Issue *issue = [[Issue alloc] init];
    ...
    [self getOrDownloadCover:issue];
    ...
}
.

GetOrdownLoad Chover: Проблема проверок, если файл уже существует локально, если он делает, он просто сохраняет этот путь, если он не загружает файл из данного URL

- (void)getOrDownloadCover:(Issue *)issue
{
    NSLog(@"issue.thumb: %@", issue.thumb);

    NSString *coverName = [issue.thumb lastPathComponent];

    NSLog(@"coverName: %@", coverName);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    __block NSString *filePath = [documentsDirectory stringByAppendingPathComponent:coverName];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // Cover already exists
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    }
    else 
    {
        NSLog(@"load thumb");

        // Download the cover
        NSURL *url = [NSURL URLWithString:issue.thumb];
        AFHTTPClient *httpClient = [[[AFHTTPClient alloc] initWithBaseURL:url] autorelease];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:issue.thumb parameters:nil];

        AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"FAILED");
    }];
        [operation start];
    }
}
.

GetOrdownloadCover: Проблема можно назвать 20 раз подряд, поэтому мне нужно было бы поставить все мои запросы в очередь, и как только очередь завершена, она все равно сможет сохранить путь (или просто отправитьУведомление, так как я уже знаю, что такое путь)

Любые предложения для этого?

Это было полезно?

Решение

Добавить an NSOperationQueue К объекту вы можете получить экземпляр в любой точке вашего приложения, например, в своем AppDelegate.Тогда просто добавьте генеракодицетагкод к этой очереди, как:

[[(AppDelegate *) [UIApplication sharedApplication].delegate operartionQueue] addOperation:operation];
.

Просто обрабатывать сохранение в блоке завершения, либо вызова metoDe из этого блока на главном потоке или опубликовать AFHTTPRequestOperation .

Чтобы вызвать основной нить Использовать GCD:

dispatch_async(dispatch_get_main_queue(), ^{
    // Call any method from on the instance that created the operation here.
    [self updateGUI]; // example
});
.

Другие советы

Не уверен, если это полезно, но ...

вместо того, чтобы использовать собственное наложение, вы можете использовать afhttpclient applicqueue.Enqueue One Operations с Enqueuehttpoperation или enqueue Array операций с EnqueueueBatchopatchogerations (я вспоминаю эти имена методов из памяти, скорее всего, выключен).

До хранения данных, специфичных для каждой операции, вы можете подкласс AFHTTTPREACESTOPWARY и установить свойства для пути, который вы хотели бы хранить.Что-то вроде этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top