0

次のコード スニペットでは、Web サービスで認証を行い、非常に小さな写真 (ファイル サイズ < 50kb) をコア データに取得しています。これは比較的問題なく動作しますが、ランダムに写真が返されません。

各写真に渡す URL が正しく、正しく解決されることを確認しました。毎回写真を返す必要があります。

LogInfo("IMPORTING PHOTO BINARY DATA.");

NSString *photoURL = value;            
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photoURL]];            
AFImageRequestOperation *operation = [AFImageRequestOperation     imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest    *request, NSHTTPURLResponse *response, UIImage *image) {

LogInfo(@"RETRIEVED PHOTO IN setValue.");                
NSData* imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
LogInfo(@"PUTTING THE IMAGE INTO CORE DATA IN setValue.");
[managedObject setValue:imageData forKey:@"personphoto"];

}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {

LogInfo(@"ERROR GETTING PHOTO IN setValue.");

}];
[operation setAuthenticationChallengeBlock:^(NSURLConnection *connection,    NSURLAuthenticationChallenge *challenge) {
NSURLCredential *newCredential = [NSURLCredential credentialWithUser:self.strSPUser password:self.strSPPW persistence:NSURLCredentialPersistenceForSession];
[challenge.sender useCredential:newCredential forAuthenticationChallenge:challenge];
}];
NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:operation];

[managedObject setValue:value forKey:@"personimageurl"];

「personimageurl」は毎回正しく設定されますが、コア データの「personphoto」は毎回画像データで更新されません。

[編集]

さらにテストを重ねた結果、帯域幅の広い接続を使用すると、接続が低速の場合よりも多くの画像がダウンロードされ、コア データに保存されることがわかりました。これは、AFImageRequestOperation のパフォーマンスに問題があることを示しています。

[編集

次のように動作するようにコードを変更しました。

MYHTTPCLIENT.M で:

- (void)downloadImageWithCompletionBlock:(void (^)(UIImage *downloadedImage))completionBlock identifier:(NSString *)identifier {
NSString* urlString = identifier;

AFImageRequestOperation* operation = [AFImageRequestOperation imageRequestOperationWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] imageProcessingBlock:nil
                                                                                       success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
                                      {
                                          LogInfo(@"SUCCESS GETTING PHOTO: %@", response);
                                          completionBlock(image);
                                      }
                                                                                       failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {

                                                                                           LogInfo(@"ERROR GETTING PHOTO IN downloadImageWithCompletionBlock.");

                                                                                       }];
[operation setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) {
    NSURLCredential *newCredential = [NSURLCredential credentialWithUser:self.strSPUser password:self.strSPPW persistence:NSURLCredentialPersistenceForSession];
    [challenge.sender useCredential:newCredential forAuthenticationChallenge:challenge];
}];
[self enqueueHTTPRequestOperation:operation];

}

次に、MYSYNCENGINE.M で上記のメソッドを次のように呼び出します。

[[OLHTTPClient sharedClient] downloadImageWithCompletionBlock:^(UIImage *downloadedImage) {
LogInfo(@"RETRIEVED PHOTO IN setValue.");
NSData* imageData = [NSData dataWithData:UIImagePNGRepresentation(downloadedImage)];
[managedObject setValue:value forKey:@"olpersonimageurl"];
LogInfo(@"PUTTING THE IMAGE INTO CORE DATA IN setValue.");   
[managedObject setValue:imageData forKey:@"olpersonphoto"];    
} identifier:photoURL];

高帯域幅接続に接続すると、ほとんどの画像が返されますが、上記のメソッドを初めて呼び出したときに返されることはありません。後続の呼び出しごとに、画像が返されます。

エラーはまったく受信されず、デバッグは、すべての画像が正常に返されたことを示していますが、すべての画像がコア データになるわけではありません。

なぜこれが起こっているのですか?

[編集終了]

4

1 に答える 1

1

簡単な解決策: Core Data に画像データを保存しないでください。

NSURLCacheインメモリとディスクベースのストレージを提供し、HTTP キャッシュ ルールを尊重します。管理対象オブジェクトごとに画像 URL を保存し、オンデマンドで画像をロードする方が、はるかに優れた方法である可能性があります。

于 2013-05-26T17:46:13.610 に答える