2013-07-19 6 views
0

URL의 이미지를 내 앱에로드하고 있습니다. 이미지 크기가 큽니다 (약 1.5Mb). 속도를 높이기 위해이 이미지를로드하는 데 여러 스레드 (예 : 2 스레드)를 어떻게 사용할 수 있습니까? 이 이미지를로드하는 데 하나의 스레드를 사용하는 경우 약 5 초가 소요되며이 기간을 줄이려고합니다.URL에서 여러 스레드로 이미지로드

+1

여러 스레드를 사용하면 단일 리소스 다운로드 속도가 빨라지지는 않습니다. 병목 현상은 장치에서 사용할 수있는 대역폭 일 가능성이 큽니다. – alxmitch

+1

이미지를 청크로 분할하고 필요에 따라 각 청크를 보내려면 클라이언트 측 코드가 두 개 (또는 그 이상)의 개별 조각을 다운로드해야하며 모든 구성 요소가있는 경우이를 다시 어셈블하기 위해 서버 측 스크립트가 필요합니다 원본 이미지로 이것은 간단한 작업이 아닙니다. –

+0

서버에 액세스 할 수 없기 때문에 나에게 힘든 것 같습니다. 클라이언트가 책임을 질 수 있다면 그럴 것입니다. – lenhhoxung

답변

1

정확합니다. 1.5Mb는 큰 이미지이며 최적화하는 방법은 많은 스레드를 사용하지 않는 것입니다. 당신이 올바른 길을 가고 있지만. 이 기법은 "슬라이싱 (slicing)"이라고하며 이미지로드 속도를 높이기 위해 웹에서 많이 사용됩니다. 따라서 이미지를 가져 와서 서버에있는 3 ~ 4 개의 작은 사진으로 잘라내십시오. 렌더링 할 때이 4 개의 이미지를 한꺼번에 호출합니다. 하나의 큰 그림보다 빠르게로드됩니다. 또한 이것은 최종 사용자의 "인식 된"대기 시간을 줄입니다.

또한 이미지를 슬라이스 할 때 이미지의 해당 부분을 표시하는 데 필요한 색상 수를 줄이면 파일 크기가 상당히 줄어들 수 있습니다.

예를 들어 Google은 기본 검색 페이지에서 기본 로고에 대해이 작업을 수행합니다. 로고가 4 분할 된 이미지를 볼 수 있습니까?

enter image description here

enter image description here 슬라이싱 단점

enter image description here

enter image description here

는 유지 비용이 증가한다는 것이다. 어떤 사람들은이 이미지 분할을 유지하고 앱이 계속 변화함에 따라 아무 것도 잘 풀리지 않도록해야합니다.

+0

그래서이 솔루션은 서버에 달려 있습니다. 감사합니다. – lenhhoxung

+0

예 해결책은 더 많은 서버입니다. 당신은 클라이언트에 이것을하는 것을 시도 할 수있다 그러나 아무 소용이 없을 것이고 당신은 조금의 퍼포먼스 이득도 거의하지 않을 것이다. –

0

다음 코드를 따르세요뿐만 아니라 이미지를로드하는 동안

//in .h file declare the following objects: 

    IBOutlet UIImageView *imgTest; 

-(IBAction)buttonTapped:(id)sender; 
-(void)LoadImage:(NSString *) irlString; 
-(void)setImage:(NSData *) imgData; 

//in .m file write the following code: 

-(IBAction)buttonTapped:(id)sender 
{ 
    [self performSelectorOnMainThread:@selector(LoadImage:) withObject:@"http://www.google.com/images/errors/logo_sm.gif" waitUntilDone:NO]; 
} 

-(void)LoadImage:(NSString *) urlString 
{ 
    NSURL *imgURL=[NSURL URLWithString:urlString]; 
    NSData *imgData=[NSData dataWithContentsOfURL:imgURL]; 
    [self performSelectorInBackground:@selector(setImage:) withObject:imgData]; 
} 

-(void)setImage:(NSData *) imgData; 
{ 
    imgTest.image=[UIImage imageWithData:imgData]; 
} 

당신은 활동 표시를 사용할 수 있습니다. buttonTapped 메소드에서 시작하고 setImage 메소드에서 중지하십시오.

이 정보가 도움이되기를 바랍니다.

+0

이미지 (큰 데이터)를 다운로드 할 때 이미 다른 스레드를 사용했기 때문에 이것이 도움이 될 것이라고 생각하지 않습니다. – lenhhoxung

관련 문제