0

스탠포드 무료 iPhone 프로젝트 (Presence 3)를 해결했습니다 (스탠포드 사이트 : www.stanford.edu/class/cs193p/cgi-bin). /downloads.php, plist에 저장된 사용자를 위해 트위터에서 데이터를 가져옵니다. 데이터로드 중에 UIActivityIndicator (스피너)가 표시됩니다. 데이터가로드되면 TableView는 목록에 사용자를 표시합니다 사진 및 사용자 상태가 표시됩니다. 사진과 함께 TableView를 성공적으로 표시하고 클릭하면 상태가있는 다른보기 컨트롤러를 불러올 수 있지만 회 전자에 추가하면 프로그램이 중단됩니다. 프로그램은 ThreadedFlickrTableView 예제 프로젝트와 거의 동일합니다.이 프로젝트는 위의 동일한 링크에서 찾을 수 있습니다 (미안하지만 새로운 사용자이고 하나의 링크 만 게시 할 수 있음). ints 내 코드에서 문제가 어디에 있었는지, 특히 cellForRowAtIndexPath 메서드에서 셀을로드 할 때 프로그램이 충돌 함을 발견했습니다. 특히 적절한 배열 (followeesPhotoURLs)에서 사진을 검색 할 때 프로그램이 충돌합니다. 이것은 배열이 비어 있기 때문입니다 - 인터넷에서 다운로드 전용 스레드가 실행을 끝내기 전에 (실행을 시작 함) 메인 스레드가 셀로드 메소드를 실행하기로 결정한 이후에 사진이 다운로드되지 않았습니다.iPhone/Cocoa Touch - 멀티 스레딩 문제 (스탠포드 프레즌스 3 프로젝트)

나는 과정에 대한 감사 토론 그룹 페이지에 보니 다른 사람이 같은 문제를 한 것으로 나타하지만 스레드는 문제가 해결되지 않습니다, 나는 아무 소용 이메일 :의 http://groups.google.com/group/iphone-appdev-auditors/browse_thread/thread/ccfc6ae99b4cf45d/ef1b8935e749c7c2?hl=en&lnk=gst&q=presence3#ef1b8935e749c7c2

답변

1

내 첫 번째 규칙 UITableView는 매번 충돌하기 때문에 준비되지 않은 섹션이나 행을 절대로보고하지 않습니다.

리소스가로드되는 동안 회 전자가 회전 중입니다. 따라서 백그라운드 프로세스의 정확한 상태를 모르기 때문에 준비가되지 않았거나 준비가되지 않은 리소스를 기다리는 중입니다. 상황이 준비되지 않았 음을 나타내는 주 스레드의 값을 설정하는 방법은 어떻습니까? 그런 다음 보조 스레드가 작업로드를 완료하면 PerformSelectorOnMainThread를 수행하여 일부 기본 스레드 함수가 진행할 수 있음을 나타내는 값을 설정하게 할 수 있습니다. 값이 계속 진행될 때까지 주 스레드가 보조 스레드가 닿을 수있는 값에 액세스하려고 시도하지 않습니다. 데이터가 준비 될 때까지 세포가 "로딩"또는 유사하게 표시하거나, 세포가 준비 될 때 세포를 추가 할 수 있습니다.

한 가지 더 - 메인 스레드 만 UI를 터치 할 수 있습니다. 명시 적으로 언급하지 않는 한 UIKit의 스레드는 안전하지 않습니다. 진행 표시기에 대한 변경 사항은 주 스레드에서 처리해야하며, 표시기를 시작하고 중지해야합니다 (보조 스레드가 위와 같이 "완료 됨"을 알리는 경우).

0

난 그냥이 오늘을 통해 작업을 완료하고 여기에 내가 관찰 사건의 순서이다 : 당신의 배열은 아무것도를 포함하지 않기 때문에

  1. 테이블보기가 아무것도로드 것은
  2. 트위터에 가서 검색합니다 스레드 데이터
  3. 테이블보기는 트위터 데이터 [self.tableView reloadData] 나 같은 경우, 당신은 사용자 이름 U를 설정하려고

으로 새로 고쳐집니다 나는 그것이 매우 구체적이기 때문에, 응용 프로그램이 정말 찾기 위해 시도하고 아무것도 찾을 수없는 경우입니다 예제의 코드와는 달리, null을 반환하지 않는 것을 생각

cell.textLabel.text = [[userInfo objectAtIndex:indexPath.row] valueForKey:@"name"]; 

에 비슷한 노래

cell.text = [photoNames objectAtIndex:indexPath.row]; 

...따라서 빈 배열을 사용하여 데이터를 처음로드 할 때 응용 프로그램 오류가 발생합니다.

내가이 문제를 해결 한 방법은 처음부터 속성 목록에서 사용자 이름을로드하는 배열을 만들어 내 배열에 얼마나 많은 항목이 있어야하는지 알 수 있도록하는 것입니다. 핵심 부분은

// Set up the cell... 
if ([userInfo count] == [userList count]) { 

사용자 정보

트위터에서 오는 데이터 사전의 내 배열입니다 ... 당신은 당신과 같은 필요한 모든 정보를 알 수 있도록 휴대를 설정하기 전에 조건을 만드는 것입니다 .

userList는 속성 목록의 값 배열입니다.