2012-10-30 2 views
0

웹 사이트에서 아이폰 앱으로 이미지를 저장하는 것에 관한 포럼 포스트에서 발견되었습니다. 모든 것을 하나의 것, 스피드 외에는 괜찮기 때문에 사용하고 있습니다.백그라운드에서 웹 사이트의 이미지를 iPhone 앱에 저장하는 방법 (빠른 작업)

이미지는 약 10KB이며 이미지가 하나있을 때 속도가 정상적으로 다운로드되지만 이미지가 15-20 개이면 매우 느립니다.

나는 내 iPhone에이 뉴스 응용 프로그램을 다운로드하여 다른 방법으로 이미지를 더 빨리 다운로드해야 함을 알고 있습니다.이 응용 프로그램을 다운로드하면 내 이미지 품질이 같거나 더 좋다고합니다.) 그리고 약 5 초 더 빠릅니다 (또는 그 이상).

내 질문은; 웹 사이트에서 iPhone 앱으로 이미지를 다운로드하는 또 다른 빠른 방법이 있습니까?

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1 

#import "downloadImage.h" 

@interface downloadImage() 

@end 

@implementation downloadImage 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 



- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *imgUrl = @"http://somesite.com/someimage.jpg"; 

    dispatch_async(kBgQueue, ^{ 

     [self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES]; 

    }); 

} 

-(void)downloadImageFromWeb:(NSString *)imgUrl{ 


    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]]]; 

    NSArray *parts = [imgUrl componentsSeparatedByString:@"/"]; 

    NSString *imgFilename = [parts lastObject]; 

    [self saveImage:image:imgFilename]; 

} 


- (void)saveImage:(UIImage*)image:(NSString*)imageName { 

    NSData *imageData = UIImageJPEGRepresentation(image, 100); 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent: 
          imageName]; 

    [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; 

    //NSLog(@"image saved"); 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
+1

Xcode와 관련된 질문의 일부가 보이지 않습니까? 아니면 하나도 없을 수도 있습니다. –

+0

NSURLConnection을 사용하여 이미지를 다운로드해야합니다. –

+0

다운로드 이미지는 인터넷뿐만 아니라 서버의 속도에 따라 달라집니다. –

답변

1

1) 일반 브라우저에서이 이미지의 실제 부하 시간을 확인, 이것은 서버 측 문제

2) 일부 검증 된 사용하려고 할 수 있습니다 :

내 코드입니다 코드 (예 : AsyncImageView)를 확인한 후 귀하와의 차이점을 확인하십시오.

3) 저장을 취소하고 다시 테스트하십시오. 스레드가 더 빨라지면 절약을 subthread하십시오 (많은 스레드를 생성하는 것은 좋지 않습니다)

4) 메인 스레드에서로드 선택기를 수행하는 이유는 무엇입니까? 백그라운드 스레드에서 수행하고 나중에 메인 이미지에서 이미지를 업데이트하십시오. 당신이 그것을 파견하는 방식은 이제 주 스레드를 차단합니다.

+0

AsyncImageView rock 's :)이 스크립트는 안전한가요? 애플이이 스크립트를 확인 했습니까? – CroiOS

+1

10k 앱 승인 앱과 같이 사용되므로 걱정하지 마십시오. – whiteagle

0
dataWithContentsOfURL 

은 동기 호출입니다. 우리 NSConnectionconnectionDidFinishedLoading에서 주 큐를 가져오고 원하는 위치로 이미지를 설정하십시오. 백그라운드에서 실행됩니다.

1

다운로드 이미지는 speedinternetserver에 따라 다릅니다.

Background process에서 다운로드를 수행 한 후 다운로드하는 동안 applicationUI을 귀찮게하지 않으려는 경우 :

[self performSelectorInBackground:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:NO]; 
+0

나는 내 첫 번째 소식에서 볼 수있는 것을 백그라운드에서 이미 다운로드하고 있습니다. – CroiOS

+1

performSelectorOnMainThread –

+0

죄송합니다. 이제 알겠습니다. 나는 그것을 시험 할 것이다. – CroiOS

0

dispatch_async이 더 나은 선택 사용. 그러나 귀하의 경우이 라인이 문제가 발생합니다

Performance : dispatch_async

ConcurrencyProgrammingGuide

이것은 :

dispatch_async(kBgQueue, ^{ 

      [self downloadImageFromWeb:imgUrl]; 

     }); 

이러한 문서를 참조하십시오 :

dispatch_async(kBgQueue, ^{ 

     [self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES]; 

    }); 

변경과 같은 코드 당신이 처리 할 수있는 좋은 Tutorial 그런 상황.

관련 문제