2012-03-07 3 views
4

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

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

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

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

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

+0

Вам нужно будет иметь отдельный 'NSManagedObjectContext' для вашего фонового потока (и каждый другой поток, а). Получив ваши объекты из сети, поместите их в контекст контекста управляемого объекта, затем синхронизируйте этот контекст с другими контекстами управляемых объектов в своем приложении. – nielsbot

+0

Мое понимание сетевой сети сотовой сети заключается в том, что латентность - ваша самая большая проблема - вы заплатите временную стоимость за каждое ваше соединение. Если вы можете комбинировать запросы, вы можете повысить производительность сети. – nielsbot

ответ

2

Что касается загрузки ресурсов, вы можете использовать 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: completionBlock: если вам нужно отслеживать прогресс.

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

AFNetworking Docs: http://afnetworking.org/Documentation/index.html

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