15

UIImageViewのAFNetworkingカテゴリとSDWebImageカテゴリのメソッド名が同じであることに気付きました。

AFNetworking:

- (void)setImageWithURL:(NSURL *)url {
    [self setImageWithURL:url placeholderImage:nil];
}

- (void)setImageWithURL:(NSURL *)url 
       placeholderImage:(UIImage *)placeholderImage
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPShouldHandleCookies:NO];
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"];

    [self setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil];
}

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
              placeholderImage:(UIImage *)placeholderImage 
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure
{
...
}

およびSDWebImage

- (void)setImageWithURL:(NSURL *)url
{
    [self setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
}

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
{
    [self setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
}

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options
{
    [self setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil];
}

...

Xcodeでは、SDWebImageメソッドをコマンドクリックすると、AFNetworkingメソッドにリダイレクトされます。その逆も同様です。

どの動作がどこで期待できますか?使用したいクラスに適切なカテゴリのヘッダーのみを含める必要がありますか?同じクラスがカテゴリの両方の実装を使用する必要がある場合はどうなりますか?

別の関連する質問「2つのObjCカテゴリが同じメソッドをオーバーライドするとどうなりますか?」は、AFNetworkingとSDWebImageの両方がサブクラスではなく同じクラスにカテゴリを追加しているため、これとまったく同じではありません。この場合、クラスが使用されているのは1回だけで、2つのカテゴリが競合しているようです。

4

3 に答える 3

8

名前の衝突は実際、Objective-C ランタイムで発生する可能性があるものです... Apple は、メソッド名に「プレフィックス」を使用することをお勧めします

予想される動作: ランタイムによって読み込まれた最後のカテゴリ/メソッドのみが有効になります。どちらですか ?悪い質問です!

私のアドバイス:名前を変更してください!

于 2013-02-06T04:06:32.183 に答える
8

名前の変更は問題を解決する最善の方法ではないようです。

ちょうど使用:

[cell.imageView setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"placeholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {

}];

そこからSDWebImage存在しないAFNetworking

于 2013-03-08T12:04:56.980 に答える
2

SDWebImage と AFNetworking の両方をそのまま使用しようとしている人のために、衝突する方法の使用を思いとどまらせるための私の原始的な解決策を次に示します。

https://gist.github.com/sibljon/5957892

これらのメソッドの実装が AFNetworking または SDWebImage で変更された場合、これは明らかに将来の証明ではなく、破損する傾向があります。それは理想的な解決策とはほど遠いものです。つまり、自己責任で!

于 2013-07-09T14:48:52.647 に答える