2017-11-21 2 views
0

테이블 뷰에 사전 배열을로드하고 테이블을 다시로드 한 다음 배열에서 사전 데이터를 변경 한 다음 테이블 뷰의 특정 인덱스를 새로 고침/다시로드하는 메소드를 호출했습니다. 하지만 내 전체 데이터가 다시 업데이트되지 않는 한 내 테이블을 스크롤 할 수 없습니다. 내 테이블 데이터를 업데이트하는 것을 시도하고있는iOS에서 테이블을 스크롤 할 수 없습니다

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    [Hud hideAnimated:true]; 
    [self.myTbl reloadData]; 
    dispatch_async(dispatch_get_main_queue(),^{ 
     [self loadTutorials]; 
    }); 
} 

방법 : 내 메서드를 호출하고 테이블을 다시로드 곳에서

코드입니다.

#pragma mark:GetAllData 
-(void)loadTutorials{ 
    dispatch_async(dispatch_get_main_queue(),^{ 


    int k = 0; 

    for (NSMutableString*linknew in linkArr) { 
    //here some calculations code for parsing then next 
     for (TFHppleElement *elements in contributorsNodes) { 
     // 5 
     for (TFHppleElement *child in elements.children) { 
      if ([child.tagName isEqualToString:@"img"]) { 
       // 7 
       @try { 
        NSString*url = [child.attributes objectForKey:@"src"]; 

        NSMutableDictionary*dict = [[feeds objectAtIndex:k] mutableCopy]; 
        [dict setObject:url forKey:@"image"]; 
        [feeds removeObjectAtIndex:k]; 
        [feeds insertObject:dict atIndex:k]; 

        NSIndexPath*index = [NSIndexPath indexPathForRow:k inSection:0]; 

        [self.myTbl reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone]; 


       } 
       @catch (NSException *e) {} 
      } 
     } 
    }k++; 
    } 
    }); 
} 

cellForRowAtIndexPath 방법 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    UILabel*lbl = (UILabel*)[cell viewWithTag:101]; 
    UIImageView*imgView = (UIImageView*)[cell viewWithTag:103]; 


    [imgView sd_setImageWithURL:[NSURL URLWithString:[[feeds objectAtIndex:indexPath.row] objectForKey:@"image"]] placeholderImage:[UIImage imageNamed:@"img.jpg"]]; 

    lbl.text = [NSString stringWithFormat:@"%@",[[feeds objectAtIndex:indexPath.row] objectForKey: @"title"]]; 

    return cell; 
} 
+0

데이터 처리에 오랜 시간이 걸리기 때문에'disptch_async'라고 가정합니다. 그렇다면이 작업을 기본 대기열로 보내려면 이해가되지 않습니다. 그럼에도 불구하고 주 스레드를 차단할 것입니다. 백그라운드 대기열에 작업을 보내고 UI 업데이트와 관련된 부분을 기본 대기열로 보내야합니다. – Losiowaty

+0

@ Losiowaty 답장을 보내 주셔서 감사합니다. 나는 방법을 넣는다 [self.myTbl reloadRowsAtIndexPaths : @ [index] withRowAnimation : UITableViewRowAnimationNone]; disptch_async 내 메서드의 시작에서 disptch_async 제거하지만 여전히 동일한 문제 –

답변

0

나를 혼란하게 귀하의 질문에 많은 일을하게한다. 당신이 후 self.myTbl 방법 loadTutorials 내부를 업데이트하는 것이 있지만 [self.myTbl reloadData]를 호출해야하는 이유 parserDidEndDocument 방법으로

  • , 나도 몰라.
  • 왜 외부와 내부 모두 dispatch_async으로 전화해야합니까 loadTutorials 방법? 나는 그것이 필요하지 않다고 생각한다. 1 번만 전화하면됩니다.
  • 배열의 개체를 바꾸려면 개체를 제거하고 삽입 할 필요가 없습니다. feeds[k] = dict을 사용하여 바꿉니다. 사용하기 전에 feeds.count > k을 확인하십시오.
  • self.myTblloadTutorials 방법으로 업데이트 할 때 충돌이 발생했기 때문에 try catch을 사용합니다. 제 의견으로는 try catch 대신 beginUpdatesendUpdates을 사용해야합니다.

내가 문제는 try catch을 사용했기 때문에 문제가 발생한 것으로 생각합니다.

우리가

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    [Hud hideAnimated:true]; 
    [self.myTbl reloadData]; 
    [self loadTutorials]; 
} 



#pragma mark:GetAllData 
-(void)loadTutorials{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    int k = 0; 

    for (NSMutableString*linknew in linkArr) { 
     //here some calculations code for parsing then next 
     for (TFHppleElement *elements in contributorsNodes) { 
     // 5 
     for (TFHppleElement *child in elements.children) { 
      if ([child.tagName isEqualToString:@"img"]) { 
      NSString*url = [child.attributes objectForKey:@"src"]; 

      // I assume in some case, feeds[k] doesn't exist. We need add an 
      // NSMutableDictionary to this index before using to avoid crash. 
      // If you make sure feeds[k] always exist you can ignore it 

      if (feeds.count == k) { 
       [feeds addObject:[[NSMutableDictionary alloc] init]]; 
      } 
      [feeds[k] setObject:url forKey:@"image"]; 

      NSIndexPath*index = [NSIndexPath indexPathForRow:k inSection:0]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self.myTbl beginUpdates]; 
       [self.myTbl reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone]; 
       [self.myTbl endUpdates]; 
      }); 
      } 
     } 
     }k++; 
    } 
    }); 
} 

먼저 코드를 해보자있을 것이다, @Losiowaty가 제안 배경 큐 당신 코드를 다시 작성하려고합니다. 그래도 문제가 있다면 알려주세요. 내가 당신을 도울 것입니다.

+0

배열에 구문 분석 된 데이터를 저장 한 후 문서 메서드 parserDidEndDocument 호출하고 테이블에 이러한 저장된 데이터를 설정하려면 내 테이블을 다시로드 내 구문 분석 된 데이터에 있습니다. 내가 이미지를 얻지 못해서 loadTutorials 메소드를 눌렀는데 내 이미지를 얻고 배열을 업데이트하고 특정 셀을 새로 고침. 나는 당신의 코드를 여전히 똑같은 문제로 시도했다. 답장을 보내 주셔서 감사합니다. –

+0

테이블 뷰가 업데이트 직후에 표시됩니까? – trungduc

+0

내 테이블 뷰가 표시되면 테이블 parserDidEndDocument가 처음으로 테이블을 다시로드하면 멈추고 모든 이미지가 loadTutorials 메서드에 의해 업데이트되면 이미지가 표시되고 스크롤 할 수 있습니다. –

관련 문제