2009-07-14 2 views
2

내 iPhone 앱에 three20 프로젝트를 사용하고 있습니다. 내 문제를 좁히고 이제 프로젝트와 함께 제공되는 '테이블의 웹 이미지'예제를 다시 만들려고합니다. 코드 을 정확히과 같이 프로젝트에 복사했습니다. 예외는 있지만 TTNavigator는 사용하지 않지만 TabBar에 수동으로 TTTableViewController를 추가합니다.스크롤 할 때까지 TTTableImageItem이 이미지를로드하지 않습니다.

문제는 다음과 같습니다. 예제와 같이 테이블의 이미지가 웹에서 자동으로로드됩니다. 하지만 이후에만로드됩니다. 테이블을 위아래로 스크롤합니다.

콘솔에 이미지가 다운로드 중이라고 표시되고 활동 표시기가 영원히 돌아가는 것을 볼 수 있습니다. 한 번 위아래로 스크롤하지 않으면 이미지가 나타나지 않습니다.

누구나? 미리 감사드립니다.

PS :

TTImageView* imageView = [[[TTImageView alloc] initWithFrame:CGRectMake(30, 30, 100, 100)] autorelease]; 
imageView.autoresizesToImage = YES; 
imageView.URL = @"http://webpimp.nl/logo.png"; 
[self.view addSubview:imageView]; 

내 AppDelegate에이 코드를 넣을 경우 (오른쪽 : 내가 어떤 임의의 UIView에이 코드를 사용하고있는 경우 는 또한 (단 검은 색 사각형 표시) 작동하지 않습니다 창문에), 그것은 작동합니다 .. 이상한가?

가능한 해결책 :이 목적을 위해 TTImageView 사용을 중단하지만 , 나는 밖으로 문제가 무엇인지 발견 생각; 스레딩 (따라서 Deniz Mert Edincik의 답을 수락 함). 비동기 다운로드를 시작한 경우 (기본적으로 TTImageView가 모두 비동기 다운로드이므로) 메인 스레드에서 시작되지만 시작되지는 않습니다. 주 스레드에서 다운로드를 시작하면 바로 시작됩니다.

답변

5

나에게 스레드 문제와 같은 소리가 들리니, 메인 runloop에 TTImageView를 만드시겠습니까?

0

이미지로드가 완료되면 reloadData 메시지를 테이블보기로 보내보십시오. 이렇게하면 테이블이 행 크기를 다시 계산하고 테이블을 다시 그립니다. 이 메시지에 대한 응답으로 이미지를 다시 다운로드하지 않도록 조심하십시오.

+0

TTImageView는 이러한 종류의 작업을 자체적으로 처리하므로이 상황에서 사용해야합니다. reloadData는 옵션이 아닙니다. 이 문제가 없어도 이미지를 다운로드 할 때마다 reloadData를 호출하면 (이미지가 많을 수 있음) 확실히 테이블이 엉망이됩니다. – Jake

0

이미지보기에서 웹에서 이미지를로드하는 것과 비슷한 내용을 작성했습니다.

이미지가 성공적으로로드되었지만보기에 표시되지 않은 제 경험으로 셀을 다시 그려야한다는 경우가있었습니다.

테이블보기를 스크롤하면 화면에 올 때 셀이 다시 그리기로 설정되므로 스크롤 할 때 셀이 표시됩니다.

이미지가로드되면 setNeedsDisplay 메시지를 보내서 이미지를 다시 그리는 중임을 알리십시오.

그런 식으로, 이미지 다운로드가 끝나면, 앉아있는 셀 (그리고 셀만 해당)이 다시 그려져 새로운 이미지가 표시됩니다.

전체 셀을 다시 그리지 않아도되며 동일한 메소드 호출을 사용하여 이미지보기를 다시 그리는 것만으로도 벗어날 수 있습니다. 내 경험에 의하면, 내 표 셀 뷰 계층 구조가 평평 해져서 전체 셀을 다시 그려야했습니다.

1

흥미로운 점이 하나 있습니다.TTTableViewController, TTTableViewDataSource 및 TTModel 조합을 사용하면 TTImageView를로드하는 것과 동일한 문제가 발생합니다. 내 문제는 모델 메서드 'isLoading'과 'isLoaded'의 구현은 모델 초기화 후에 적절한 값을 반환하지 않는다는 것입니다. 그 때문에 'viewDidAppear'메서드에서 모델을 수동으로 다시로드해야하므로 이미지로드 문제가 발생합니다. 그래서 'isLoading'과 'isLoaded'메소드를 수리하여 모델 초기화 후에 'NO'를 반환하면 모든 것이 정상입니다.

0

에 대한 대답이 없으므로을 원하지만이 기능과 예상되는 동작으로 간주됩니다. 당신은 이미지의 게으른 로딩을 원할 때 UITableView에서 TTImageView를 사용한다. TTImageView는 프레임이 화면에 표시되는 이미지 만로드합니다. 그렇게하면 장치는 네트워크 리소스를 사용하여 사용자가 보려고하는 이미지조차보다는 사용자가 앞에있는 이미지를 다운로드합니다.

친구 목록과 같은 수백 개의 미리보기 이미지가 포함될 수있는 긴 목록을 고려해보십시오. 경험에 비추어 볼 때 오래된 장치에서 100 개 이상의 이미지 요청을 시작하면 메모리 사용이 지붕을 통과하여 앱이 다운 될 가능성이 있습니다. TTImageView는이 문제를 해결합니다.

+0

게으른 로딩 원칙을 얻지 만 스레딩 문제였습니다. NSURLRequest는 메인 스레드에서만 수행 할 수 있습니다. – Jake

0

이것은 스레드 문제입니다. 당신은 선을 포함하여 이미지를로드 할 수

[TTURLRequestQueue mainQueue].suspended = NO; 

- (void)didLoadModel:(BOOL)firstTime에.