2012-02-14 3 views
-1

Мне нужно сделать несколько веб-запросов и хочу, чтобы они были быстрыми. Объем данных очень мал, но сервер использует некоторое время для ответа, поэтому я думаю об использовании нескольких потоков. Проблема заключается в том, как обрабатывать возвращаемые значения. Я не знаю, работает ли это:Соберите возвращаемое значение из нескольких потоков

- (void)findAuthorsForBookIDs:(NSArray*)bookIDs 
{ 
    for (NSString* thisBookID in bookIDs) 
    { 
     [NSThread detachNewThreadSelector:@selector(findAuthorForBook:) toTarget:self withObject:thisBookID]; 
    } 
} 

-(void)findAuthorForBook:(NSString*)thisBookID 
{ 
    NSString *downloadString = [NSString stringWithFormat: 
            @"http://somewebsite.com/Mediator?bookIDNo=%@", 
            thisBookID]; 

    NSURL *downloadUrl = [NSURL URLWithString:downloadString]; 

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:downloadUrl]; 

    NSError *error; 
    NSURLResponse *response; 

    NSData *urlData = [NSURLConnection sendSynchronousRequest:urlRequest 
            returningResponse:&response 
               error:&error]; 

    NSString *html2; 

    if (urlData) 
    { 
     html2 = [[NSString alloc] initWithData: urlData encoding: NSISOLatin1StringEncoding]; 
    } 

    [self findAuthorForBookDidFinishWithAuthor:html2 andBookID:thisBookID]; 


} 

-(void)findAuthorForBookDidFinishWithAuthor:(NSString *)authorName andBookID:(NSString *)bookID 
{ 
    [[self bookList]setValue:authorName forKey:bookID]; 
} 

Я не знаю, справится ли это с [self bookList]? Должен ли я использовать какие-то замки или что-то еще?

EDIT

Я сделал некоторое чтение и интересно, если это то, что мне нужно сделать?

NSLock * myLock = [[NSLock alloc] init];

-(void)findAuthorForBookDidFinishWithAuthor:(NSString *)authorName andBookID:(NSString *)bookID 
{ 
    [myLock lock]; 
    [[self bookList]setValue:authorName forKey:bookID]; 
    [myLock unlock]; 
} 

Pls комментарий, не только «минус один» меня, даже если я полный придурок :-) Минус один не говорит мне много. (За исключением того, что я далеко)

ответ

1

Для достижения этой цели нитью, а не NSURLConnection. Вы можете открывать несколько одновременных запросов без потоков. Однако, как правило, время ожидания подключения к серверу является самым большим препятствием для работы на мобильных устройствах. Если вы сможете поддерживать единое соединение, все будет идти быстрее. NSURLConnection сделает это автоматически, используя HTTP/1.1 соединения, если вы его отпустите (т. Е. Если вы не будете бороться с ним, выполнив собственную поточную передачу). Открытие многих одновременных подключений вряд ли поможет вам, однако, если сервер не очень медленно реагирует на каждый, но все же способен обрабатывать многие параллельно (это очень редкая ситуация).

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