2016-08-22 3 views
0

채팅 응용 프로그램을 만들었습니다. 이런 방식으로 메시지를받은 :테이블 뷰 다시로드 데이터가 응용 프로그램의 백그라운드에서 작동하지 않음

-(void)msgRecevied:(NSMutableDictionary *)messageContent 
{ 
    NSString *m = [messageContent objectForKey:kMsg]; 
    [messageContent setObject:[m substituteEmoticons] forKey:kMsg]; 
    [messageContent setObject:[messageContent objectForKey:kTrnDate] forKey:kTrnDate]; 
    [messageContent setObject:[messageContent objectForKey:kSender_User] forKey:kSender_User]; 
    [messageContent setObject:[messageContent objectForKey:kReceiver_User] forKey:kReceiver_User]; 

    [arrayChat addObject:messageContent]; 
    NSLog(@"%@",arrayChat); 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self.tblChat reloadData]; 
    }); 

    if(arrayChat.count > 1){ 

     NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:arrayChat.count-1 
                 inSection:0]; 

     [self.tblChat scrollToRowAtIndexPath:topIndexPath 
          atScrollPosition:UITableViewScrollPositionMiddle 
            animated:YES]; 
    } 
} 

나 메시지를 수신하면 그것을 배열에 추가 메시지라고 numberOfRowsInSection보다 테이블을 다시로드하고 또한 numberOfRowsInSection에서 계산하며 또한 아니지만 호출 증가 어레이 인쇄 cellForRowAtIndexPath 그래서 내 메시지를 보여줄 수 없다.

또한 메인 스레드없이 테이블을 다시로드했지만 작동하지 않았습니다.

거기에 무슨 문제가 있습니까?

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    NSLog(@"%lu",[arrayChat count]); 
    return [arrayChat count]; 

} 

편집

죄송하지만,이 문제는 응용 프로그램이 배경에서 오는 후에 발생한다.

나는 테이블을 prtinted :

2016-08-22 11:21:02.465 Diamonds[16679:6710554] 
<UITableView: 0x12e0a6200; frame = (0 55; 250 332); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x6f50>; animations = { position=<CASpringAnimation: 0x1320e3b40>; bounds.origin=<CASpringAnimation: 0x132173610>; bounds.size=<CASpringAnimation: 0x132173700>; bounds.origin-2=<CASpringAnimation: 0x13215c1b0>; bounds.size-2=<CASpringAnimation: 0x13215c2a0>; 
}; 
layer = <CALayer: 0x5a20>; contentOffset: {0, 3609}; contentSize: {250, 3941.197265625}> 

배경에서 오는 후 : 응용 프로그램 실행이

2016-08-22 11:19:51.910 Diamonds[16676:6709818] 
<UITableView: 0x1388e2e00; frame = (0 55; 250 0);clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x13ca33040>; layer = <CALayer: 0x13c9e2bf0>; contentOffset: {0, 3125}; contentSize: {250, 3855.68359375}> 

편집

나는 또한 하나 개의 버그를 발견했을 때 내가 arrayChat에 추가 된 객체가 추가되지만 whe n 앱에서 잃어버린 배경에서부터 응용 프로그램을 추가 한 마지막 객체보다 두 번째로 데이터를 다시로드합니다.

+0

배열에 개체가 있는지 확인 했습니까? – user3182143

+0

예. 새 객체를 추가하고 .. numberOfRowsInSection의 수가 증가합니다. – Kabali

+0

코드 작성 – user3182143

답변

0

백그라운드 스레드에서 시간이 많이 걸리는 데이터로드 작업을 완료 한 다음 데이터가 메인 스레드에서 준비되면 UI/셀을 업데이트하려고합니다.

dispatch_queue_t concurrentQueue = dispatch_queue_create("Queue", NULL); 
     dispatch_async(concurrentQueue, ^{ 
      [self loadData]; 
     }); 

-(void)loadData 
{ 
    // Expensive operations add/remove data to NSArray or NSDictionary 
    . 
    .  
    // Operation done - now let's update our table cells on the main thread 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self.tblChat reloadData]; 
    }); 
} 
+0

작동하지 않습니다 ...이 코드를 추가 ...하지만 마지막 개체를 배열에 추가 할 때 내가 테이블에서 다시로드 할 때 배열에서 사라집니다. – Kabali

관련 문제