2015-01-06 2 views
0

인터넷에서 다운로드 한 이미지를 저장하는 데 사용하려고하는 싱글 톤 클래스가 있으므로 언제든지 액세스 할 수 있습니다. 작업 흐름은 Facebook에 로그인하고 이미지를 Singleton 클래스로 다운로드합니다. 모든 것이 잘되고 이미지가 잘 표시됩니다. 그러나 앱 실행을 중단하면 그림이 더 이상 존재하지 않습니다. 누군가가 내 코드를보고 이미지를 항상 유지하기 위해 뭔가를 놓치고 있는지 확인할 수 있습니까? 앞서 말했듯이, 처음에는 잘 작동하지만, 앱을 종료하면 UIImage은 더 이상 존재하지 않습니다.싱글 톤 클래스 유지 UIImage

FBSingleton.h

@interface FBSingleton : NSObject 

@property (nonatomic, strong) UIImage *userImage; 

+ (instancetype)sharedInstance; 
@end 

FBSingleton.m

@implementation FBSingleton 

FBSingleton *sharedInstance = nil; 

// Get the shared instance and create it if necessary. 

+ (FBSingleton *)sharedInstance { 
    @synchronized(self){ 
     if (sharedInstance == nil) { 
      sharedInstance = [[super allocWithZone:NULL] init]; 
     } 
    } 
    return sharedInstance; 
} 

- (id)init 
{ 
    self = [super init]; 

    if (self) { 
     // Work your initialising magic here as you normally would 

     self.userImage = [[UIImage alloc] init]; 
    } 

    return self; 
} 

@end 

의 ViewController (화상 저장 담당)

NSURL *pictureURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=square&return_ssl_resources=1", facebookID]]; 

       NSLog(@"Picture URL%@", pictureURL); 
       NSURLRequest *urlRequest = [NSURLRequest requestWithURL:pictureURL]; 

       // Run network request asynchronously 
       [NSURLConnection sendAsynchronousRequest:urlRequest 
                queue:[NSOperationQueue mainQueue] 
             completionHandler: 
       ^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
        if (connectionError == nil && data != nil) { 
         // Set the image in the header imageView 
         // self.headerImageView.image = [UIImage imageWithData:data]; 
         FBSingleton *sharedSingleton = [FBSingleton sharedInstance]; 
         UIImage *image = [UIImage imageWithData:data]; 
         sharedSingleton.userImage = image; 
        } 
       }]; 
+0

다시 말하면 앱을 다시로드하면 UIImageView가 비어 있습니다. 아니면 UIImage가 비어 있습니까? 디스크/캐시에 Save/Load 기능을 만들었습니까? 아니면 온라인으로 만 만들려합니까? – gronzzz

+1

FYI 싱글 톤을하는 더 좋은 방법은'dispatch_once'입니다 – ahwulf

답변

4

이미지가 디스크에 저장 될 것으로 예상되지만 디스크에 저장하거나 디스크에서로드하는 코드는 표시되지 않습니다. 응용 프로그램을 실행하는 동안 이미지를 유지하려면 파일에 이미지를 작성해야합니다. strong 속성의 이미지는 메모리가 할당되어있는 동안에 만 보유됩니다. 응용 프로그램이 종료되면 메모리가 해제됩니다.

이것이 분명히 문제는 아니지만 문제에 대한 설명을 기반으로 볼 때 '오류'의 원인 일 가능성이 큽니다. 중 하나를 사용하십시오 :

[UIImagePNGRepresentation(image) writeToFile:cachedNameAbsolutePath atomically:YES]; 
[UIImageJPEGRepresentation(image, 1.0) writeToFile:cachedNameAbsolutePath atomically:YES]; 

앱이 시작될 때 그런 cachedNameAbsolutePath가 존재하는지 확인하고 이미지를로드 확인하십시오. 존재하지 않는다면 페이스 북에 연락하여 이미지를 다시 다운로드해야한다.

+0

싱글 톤 클래스 나 다운로드 할 때 ViewController 클래스에 그 중 하나를 넣어야합니까? 거기에 넣으려고했지만 cachedNameAbsolutePath가 오류를 발생 시켰습니다. – user717452

+0

파일을 다운로드 한 곳에서이 파일을 실행하고 싶을 것입니다. 귀하의 경우에는 ViewController가됩니다. 'cachedNameAbsolutePath'에 대한 자신의 값을 이미지 파일의 대상 파일 이름으로 계산해야합니다. "myCachedImage.png"와 같은 것이지만 절대 경로입니다. –