1

これには少し問題があります。次のような URL から画像をロードしています。

+ (void)getImageFromURL:(NSString *)imageFilename urlMode:(NSString *)mode block:(id (^)(UIImage *responseImage))aImage {

    NSURL *url = [NSURL URLWithString:[mainURL stringByAppendingString:mode]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"GET"];

    AFImageRequestOperation *requestOperation = [AFImageRequestOperation imageRequestOperationWithRequest:request
                                                                              imageProcessingBlock:nil
                                                                                         cacheName:nil
                                                                                           success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
                                          {
                                              aImage(image);
                                          }
                                                                                           failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
                                          {
                                              // manage errors
                                          }];
    [[[NSOperationQueue alloc]init] addOperation:requestOperation];
}

このリクエストからの応答に iVar UIImage *userAvatar を設定しようとしていますが、問題は、非同期リクエストであるため、コードが移動する前に iVar が設定されていないため、iVar が空であるということです。 m にアクセスして別のメソッドに渡します。

4

2 に答える 2

2

それが非同期プログラミングの性質です。userAvatar可用性が非決定論的であることを考慮して、依存関係を再設計する必要があります。

そのため、操作の成功ブロックで単にuserAvatarivar を設定するのではなく、そのイメージが利用可能になったときに必要なことは何でも処理します。たとえば、UIImageViewの画像を設定する場合は、成功ブロックで次のようにします。

dispatch_async(dispatch_get_main_queue(), ^{
    myImageView.image = image;
});

(目標の詳細と実装の詳細を知らなくても、これは単なる「たとえば...」です)

于 2012-03-14T18:52:39.753 に答える
1

最後に追加するのを忘れていまし[requestOperation start];た。

于 2012-11-30T21:08:29.043 に答える