2016-09-03 2 views
0

채팅 앱이있어서 서버에서 기록을 가져오고 하나씩 메시지를 가져 와서 하나의 메시지를 가져 와서 배열에 추가하고 행을 테이블에 추가합니다 ..이 프로세스는 매우 빠릅니다 . 여기insertRowsAtIndexPaths에 충돌이 발생했습니다.

코드입니다 :

-(void)msgRecevied:(NSMutableDictionary *)messageContent 
{ 
     if([chatWithUser isEqualToString:[messageContent objectForKey:kReceiver_User]]) 
      return; 

     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]; 

     NSMutableDictionary *arrayTemp1 = [messageContent mutableCopy]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 


      [app.Glb.arrayChat addObject:arrayTemp1]; 
      numberOfRows = app.Glb.arrayChat.count; 

      if([app.Glb.arrayChat count] > 0) 
      { 

       [self.tblChatting beginUpdates]; 
       NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:[app.Glb.arrayChat count]-1 inSection:0]; 
       [self.tblChatting insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
       [self.tblChatting endUpdates]; 

       [self.tblChatting scrollToRowAtIndexPath:newIndexPath 
             atScrollPosition:UITableViewScrollPositionBottom 
               animated:YES]; 
       newIndexPath = nil; 
      } 
     }); 
} 

하지만 난 endUpdates에 충돌을 얻고있다 : 당신이 messageContent 데이터를 얻고있다

2016-09-03 10:47:32.638 [313:50270] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil' 
*** First throw call stack: 
(0x2379f98b 0x22f3ae17 0x236b4e1f 0x2804372b 0x27d43a19 0x27d5aaa3 0x27f1a741 0x27efe987 0x7e93b 0x7a7b7f 0x7a7b6b 0x7ac655 0x23761bdd 0x237600d7 0x236af2e9 0x236af0d5 0x24c9fac9 0x27d740b9 0x39424d 0x23357873) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

먼저 앱이 충돌하는 곳을 확인하십시오. - [__ NSArrayM insertObject : atIndex :] : 객체는 변경 가능 배열에 nil을 삽입 할 것을 제안 할 수 없습니다. –

+0

하지만 insertObject :를 사용하지 않았습니다. 내 클래스에서 – Kabali

답변

0

검사 오류가 당신이 배열에 전무 객체를 추가하는 것을 말한다 때문에 . 서버에서 데이터를 가져 오는 경우 서버 호출 또는 네트워크 호출의 completion handler에서 msgRecevied 메서드로 호출해야합니다. 두 번째로 행을 삽입 할 필요가 없습니다. 배열 (데이터 소스로 사용됨)에 새 객체를 추가하기 만하면 relaod 테이블 뷰이므로 cellforrowatindexpath은 모든 것을 관리합니다.

+0

예 reloadData는 작동하지만 테이블에 메시지 셀을 추가하지는 못했습니다. 그래서이 해결책을 생각 해낸다. messageContent는 내가 확인한 메시지가 아닙니다. – Kabali

+0

그래서 문제가 해결 되었습니까? – Lion

+0

아니오, 내가 그 reloadData 내 문제를 해결한다는 것을 말하고 있지만 사용자가 테이블에 행을 추가하지 않는 메시지를 보낼 때 오류가 발생 ... 그래서 내가 테이블을 다시로드 테이블 대신에 행을 삽입이 솔루션을 생각해 낸다 – Kabali

관련 문제