2014-09-15 4 views
-2

Я строю статью, читающую приложение. Я анализирую данные JSON, используя NSData в UITableView.Как заполнить данные JSON в UITableView с помощью NSUrlConnection?

У меня проблема с данными, которые не являются нагрузкой при медленной скорости интернета (2g или 3g), так как пользовательский интерфейс пуст.
Я хочу реализовать NSUrlConnection , но я новичок в разработке iOS, неспособный реализовать NSUrlConnection в своем коде.

это мой код:

 - (void)viewDidLoad 
     { 
      [super viewDidLoad]; 
      BOOL myBool = [self isNetworkAvailable]; 
      if (myBool) 
      { 
       @try { 
       // for table cell seperator line color 
       self.tableView.separatorColor = [UIColor colorWithRed:190/255.0 green:190/255.0 blue:190/255.0 alpha:1.0]; 

      UIBarButtonItem *backbutton1 = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:nil]; 
      [[self navigationItem] setBackBarButtonItem:backbutton1]; 
      _Title1 = [[NSMutableArray alloc] init]; 
      _Author1 = [[NSMutableArray alloc] init]; 
      _Images1 = [[NSMutableArray alloc] init]; 
      _Details1 = [[NSMutableArray alloc] init]; 
      _link1 = [[NSMutableArray alloc] init]; 
      _Date1 = [[NSMutableArray alloc] init]; 

      NSData* data = [NSData dataWithContentsOfURL:ysURL]; 
      NSArray *ys_avatars = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
      if(ys_avatars){ 
      for (int j=0;j<ys_avatars.count;j++) 
       { 
       if(ys_avatars[j][@"title"]==[NSNull null]){ 
       [_Title1 addObject: @""]; 
      } 
      else{ 
       [_Title1 addObject:ys_avatars[j][@"title"]]; 
       } 
       if(ys_avatars[j][@"author"]==[NSNull null]){ 
       [_Author1 addObject: @""]; 
       } 
       [_Author1 addObject: ys_avatars[j][@"author"]]; 
       if(ys_avatars[j][@"featured_img"]==[NSNull null]){ 
       [_Images1 addObject: @""]; 
       } 
       else{ 
        [_Images1 addObject: ys_avatars[j][@"featured_img"]]; 
      } 
       if(ys_avatars[j][@"content"]==[NSNull null]){ 
       [_Details1 addObject: @""]; 
       }else{ 
       [_Details1 addObject:ys_avatars[j][@"content"]]; 
       } 
       if(ys_avatars[j][@"permalink"]==[NSNull null]){ 
       [_link1 addObject: @""]; 
      } 
       else{ 
        [_link1 addObject:ys_avatars[j][@"permalink"]]; 
       } 
       if(ys_avatars[j][@"date"]==[NSNull null]){ 
       [_Date1 addObject: @""]; 
       } 
       else{ 
       NSString *newStr=[ys_avatars[j][@"date"] substringToIndex:[ys_avatars[j][@"date"] length]-3]; 
       [_Date1 addObject:newStr]; 
       } 
      } 
     } 
     else 
     { 
      NSLog(@"asd"); 

      } 
     } 
     @catch (NSException *exception) { 
       } 

      } 
     } 

     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
      { 
      static NSString *Cellidentifier1 = @"ysTableViewCell"; 
      ysTableViewCell *cell1 = [tableView dequeueReusableCellWithIdentifier:Cellidentifier1 forIndexPath:indexPath]; 
      long row = [indexPath row]; 
      cell1.TitleLabel1.text = _Title1[row]; 
      cell1.AuthorLabel1.text = _Author1[row]; 
      NSString *StoryUrl = [_Images1[indexPath.row]  stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
      if(StoryUrl) { 
      NSArray *subStringsUrl = [yourStoryUrl componentsSeparatedByString:@"/"]; 
      NSString *stripedName = [subStringsUrl lastObject]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
       NSString *documentsDirectory = [paths objectAtIndex:0]; 
       NSString* filePath =[documentsDirectory stringByAppendingPathComponent:  [NSString stringWithFormat:@"%@",stripedName]]; 
      if(filePath) { 
      UIImage *image = [UIImage imageWithContentsOfFile:filePath]; 
       if(image) { 
      ysTableViewCell *updateCell =(id)[tableView cellForRowAtIndexPath:indexPath]; 
      if(updateCell) 
       updateCell.ThumbImage1.image=image; 
      cell1.ThumbImage1.image=image; 
      } else { 
       dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
       dispatch_async(taskQ, ^{ 
       NSURL *Imageurl = [NSURL URLWithString:yourStoryUrl]; 
       NSData *data = [NSData dataWithContentsOfURL:Imageurl]; 
       UIImage *images1 = [[UIImage alloc] initWithData:data]; 
       NSData *imageData = UIImagePNGRepresentation(images1); 
       if (![imageData writeToFile:filePath atomically:NO]) 
       { 
        NSLog((@"Failed to cache image data to disk")); 
       } 
       else 
       { 
        NSLog(@"the cachedImagedPath is %@",filePath); 
       } 
       dispatch_sync(dispatch_get_main_queue(), ^{ 
        ysTableViewCell *updateCell =(id)[tableView cellForRowAtIndexPath:indexPath]; 
        if(updateCell) 
         updateCell.ThumbImage1.image=images1; 
        cell1.ThumbImage1.image=images1; 
       }); 
       }); 
      } 

return cell1; 

}

Помощь ценится. Спасибо заранее.

ответ

0

Это выглядит действительно грязно, и я предлагаю вам изменить весь дизайн.

Основной и чище путь (но, вероятно, не самый лучший/чистый способ):

  1. Создать класс для обработки вне-обзора соответствующей работы (JSON разбора здесь)
  2. вызовов, что класс в viewDidLoad для начала разбора
  3. Вызвать метод, который обновляет представление таблицы с помощью вновь проанализированных данных, когда разбор выполняется (в классе JSON).

Таким образом, представление таблицы сначала загрузит ваши заполнители, а затем перезагрузится, когда у него будут данные.

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

Вы можете найти то, что вам нужно, или написать код в одиночку? или вам нужна помощь? Если да, то с чем?

EDIT: вы также можете использовать фреймворк AFNetworking, который сделает вашу жизнь в 10 раз проще с кодом JSON/Internet.

+0

@thanks я ЗИЛ применит ваше предложение в моем коде, прямо сейчас вы могли бы мне помочь в реализации NSURLConnection в этом коде .. – Daljeet

+0

я просто отредактировал мой ответ, но я настоятельно советую вам следовать учебник о AFNetworking, это менее сложно, чем NSUrlConnection, и творит чудеса. Вы можете найти справку об этом на raywenderlich (google it) или tutorialspoint (google it). Если вы будете следовать учебному курсу с нуля, это поможет вам намного больше, чем мне, и вам нужно около 2 часов. Итак, google this: afnetworking raywenderlich, следуйте за ним, и вы станете счастливым человеком. Кроме того, убедитесь, что если это действительно помогает, это тоже помогает: P –

+0

@ спасибо Zli, я уже прошел этот учебник, но опять-таки проблема в реализации, но я попробую еще раз и повышу вас – Daljeet

0

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

Попробуйте этот учебник, это поможет вам понять, как работает реализация Apple, прежде чем добавлять стороннюю библиотеку, которая маскирует ее для вас.

NSUrlConnection Tutorial

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