Как лучше структурировать код для загрузки ресурсов, используя AFNetworking и CoreData в iOS - PullRequest
4 голосов
/ 07 марта 2012

Сначала я загружаю один индексный документ с использованием AFHTTPClient и записываю каждую запись с использованием CoreData. Затем мне нужно ускорить отдельный процесс, чтобы загрузить каждую отдельную запись. Какой лучший способ сделать это?

Разумно ли сделать запрос на каждый ресурс и просто дать ему завершить? Там может быть сто или около того.

В качестве альтернативы, я мог бы загрузить сначала, отправить запрос, затем при успешной загрузке и отправить последующие запросы.

Я использую CoreData для обновления базы данных, что, как я предполагаю, означает, что мне нужно иметь отдельный NSManagedObjectContent для каждого запроса?

Мне также любопытно узнать, выполняет ли AFHTTPClient обратные вызовы в основном потоке или в потоке, который инициировал запрос? Я бы предпочел не блокировать основной поток при выполнении операций ввода-вывода CoreData.

1 Ответ

2 голосов
/ 21 июля 2012

Что касается загрузки ресурсов, вы можете использовать AFNetworking для их очереди.

Возможно, вы сможете использовать - (void) enqueueHTTPRequestOperation: (AFHTTPRequestOperation *) операцию AFHTTPClient.

Сначаласоздайте синглтон для хранения собственного AFHTTPClient, например, так:

@interface CustomHTTPClient : NSObject

+ (AFHTTPClient *)sharedHTTPClient;

@end


@implementation CustomHTTPClient

+(AFHTTPClient *)sharedHTTPClient {

  static AFHTTPClient *sharedHTTPClient = nil;

  if(sharedHTTPClient == nil) {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

    // Create the http client
    sharedHTTPClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://mybaseurl.com"]];

    });
  }

  return sharedHTTPClient;
}

@end

Затем поставьте в очередь ваши запросы следующим образом:

// Store the operations in case the failure block needs to cancel them
__block NSMutableArray *operations = [NSMutableArray array];

// Add operations for url
for (NSURL *url in urls) {

  NSURLRequest *request = [NSURLRequest requestWithURL:url];

  __block AFHTTPRequestOperation *operation = [[CustomHTTPClient sharedHTTPClient] 
                                           HTTPRequestOperationWithRequest:request 
                                           success:^( AFHTTPRequestOperation *operation , id responseObject ){

                                             // Do something

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

                                             // Cancel all operations if you need to
                                             for (AFHTTPRequestOperation* operation in operations) {
                                               [operation cancel];
                                             }

                                           }];

  [operations addObject:operation];    
}

for (AFHTTPRequestOperation* operation in operations) {
  [[CustomHTTPClient sharedHTTPClient] enqueueHTTPRequestOperation:operation];
}

Также есть enqueueBatchOfHTTPRequestOperations: progressBlock: завершение блока: если вам нужно отслеживатьПрогресс.

Проект AFNetworking: https://github.com/AFNetworking/AFNetworking/

Документы AFNetworking: http://afnetworking.org/Documentation/index.html

...