2014-01-04 3 views
0

Я пытаюсь получить данные с веб-сайта, чтобы отобразить его в виде таблицыNSURLConnection didReceiveData не загружая данные

Мой код:

-(void)loadTutorials { 
    NSURL *url = [NSURL URLWithString:[@"http://www.example.com/search?q=" stringByAppendingString:self.searchString]]; 
    NSURLRequest *UrlString = [[NSURLRequest alloc] initWithURL:url]; 

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:UrlString 
                  delegate:self]; 

    [connection start]; 
    NSLog(@"Started"); 

} 


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
     TFHpple *tutorialsParser = [TFHpple hppleWithHTMLData:data]; 

     NSString *tutorialsXpathQueryString = @"//div[@id='header']/div[@class='window']/div[@class='item']/div[@class='title']/a"; 
     NSArray *tutorialsNodes = [tutorialsParser searchWithXPathQuery:tutorialsXpathQueryString]; 

     NSMutableArray *newTutorials = [[NSMutableArray alloc] init]; 

     for (TFHppleElement *element in tutorialsNodes) { 

      Data *tutorial = [[Data alloc] initWithTitle: [[element firstChild] content] 
                Url: [@"http://www.example.com" stringByAppendingString: [element objectForKey:@"href"]] 
           ]; 

      [newTutorials addObject:tutorial]; 


     } 

     _objects = newTutorials; 
     [self.tableView reloadData]; 


} 

но данные не отображаются, это данные не закончилась загрузка? я получил его на работу без NSURLConnection, но тогда он остановит программу, пока данные не получили

ответ

5

NSURLConnectionDataDelegate Согласно

connection:didReceiveData: 

вызывается в приращением образом.

Новые доступные данные. Делегат должен конкатенировать содержимое каждого переданного объекта данных для создания полных данных для URL-адреса .

Это означает, что вы должны добавить новые данные в этот метод.

Затем в

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

вы должны манипулировать данными.

Так, например

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    // Create space for containing incoming data 
    // This method may be called more than once if you're getting a multi-part mime 
    // message and will be called once there's enough date to create the response object 
    // Hence do a check if _responseData already there 
    _responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the new data 
    [_responseData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Parse the stuff in your instance variable now  
} 

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

Простым примечанием является следующее. Если данные слишком велики, и вам нужно выполнить некоторые вычисления (например, синтаксический анализ), вы можете заблокировать пользовательский интерфейс. Итак, вы можете переместить разбор в другом потоке (GCD - ваш друг). Затем, когда закончите, вы можете перезагрузить таблицу в основном потоке.

См. Также дополнительную информацию: NSURLConnectionDataDelegate order of functions.

+0

Спасибо большое, что помогло: D – Verendus

+0

@ user3082887 Счастливый слух, который сработал для вас. –

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