2015-04-07 3 views
1

Я пытаюсь загрузить несколько фотографий в фоновом режиме с использованием AFNetworking, и мне удалось заставить его работать.
Основная проблема, с которой я сейчас сталкиваюсь, - это память, при загрузке более 10 фотографий заканчивается мое приложение.
То, что я делаю, просто запускает все загрузки одновременно, как я читал в некоторых ответах на StackOverflow.
Теперь, когда возникает эта проблема, я задаюсь вопросом, не делаю ли я что-то неправильно с управлением памятью, или если лучшей стратегией будет сериализация загрузок, начните первый, а когда она прекратится, начните загрузку следующего в handleEventsForBackgroundURLSession метод.
Прежде чем полностью изменить проект загрузки, я хотел бы услышать от кого-то, если это хорошая альтернатива, так как большинство ответов, которые я видел по этому поводу, утверждают, что нужно сжечь все запросы вместе.Загрузка фотографий и фотографий с несколькими фотографиями

Спасибо

ответ

0

Создать NSOperationQueue и добавить все ваши операции загрузки изображения в этой очереди. Эта очередь будет управлять вашей системной памятью. См. Ниже пример кода.

 NSOperationQueue *myQueue = [[NSOperationQueue alloc]init]; 
    NSURLRequest *request = [[AFHTTPRequestSerializer serializer] 
           multipartFormRequestWithMethod:@"POST" 
           URLString:apiPostPhoto(singleton.userId, @"icon") 
           parameters:nil 
           constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

            NSString *filepath = [[CustomFunctions getFilesPath] stringByAppendingPathComponent:@"icon.png"]; 
            [formData appendPartWithFileURL:[NSURL fileURLWithPath:filepath] name:@"uploadicon" error:nil]; 
           } error:nil 
           ]; 
     AFHTTPRequestOperation *operationUploadOne = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

      NSLog(@"uploadlogo:%@",operation.responseString); 
      [[NSUserDefaults standardUserDefaults]setObject:operation.responseString forKey:KEY_LOGO_TIMESTAMP]; 

     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"uploadlogo:%@",[error description]); 
     }]; 
     [operation addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionNew context:nil]; 

     [myQueue addOperation:operationUploadOne]; 

       AFHTTPRequestOperation *operationUploadTwo = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
      [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    } 
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    }]; 

      [myQueue addOperation: operationUploadTwo]; 

Вы можете добавить еще количество операций, используя этот метод.

[myQueue addOperation: operationUploadTwo];

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