2014-09-08 15 views
7
ile

sorgu paramlarını dikkate almayın Uygulamamdaki görüntüleri önbelleğe almak için SDWebImage kullanıyorum, ancak yakın zamanda önbelleğe alınacak görüntülerin yenilenmesi gereken bir sorunla karşılaştım. Ona baktığımda, AWS'den gelen tam görüntü URL'sinin, URL'nin sonuna eklenen parametreleri nedeniyle değiştiğini fark ettim. Görüntü URL'sini içeren nesneyi her getirdiğimde, görüntü URL'si dinamik bir "imza" ve "geçerlilik süresi" parametresiyle döner (güvenlik amacıyla). Görüntü önbelleği ile ilgili olarak farklı bir URL, ancak görüntü ile aynı yola dikkat edin.SDWebImage

İlk getirme:

https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId=SOMEKEY&Signature=vrUFlMFEQ9fqQ%3D&Expires=1441702633

tekrar 1 saniye sonra getir:

bu durumun üstesinden gelmek için en iyi yolu nedir

https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId=SOMEKEY&Signature=2mcMxUJLyJd7E%3D&Expires=1441703105

? SDWebImage, dosyaya giden yolun ötesinde sorgu paramlarını yok saymak için bir seçenek varsa, harika olurdu.

cevap

10

SDWebImage, özel bir anahtar kullanmanıza olanak tanıyan bir yönteme sahiptir; bu, AWS'nin her çağrıldığında sorguyu değiştirdiği durumda yardımcı olur. Daha fazla okuma için

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { 
     url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; 
     return [url absoluteString]; 
    }; 

    // Your app init code... 
    return YES; 
} 

: SDWebImage | Using the cache key filter

+0

u çözdü mü? –

6

@John 'ın cevabı çok iyidir, ama bazen bir araya geldi çöktü.

aşağıda daha kararlı bir sürümüdür.

SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { 
    if([[url absoluteString] isEqualToString:@""]){ 
     return @""; 
    } 
    url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; 
    return [url absoluteString]; 
}; 

Bu ek kod denetler url geçerli olup olmadığını. [[NSURL alloc] initWithString:@""] veya bunun gibi bir şey çöküyor.

+0

Cevabınızı açıklayabilir misiniz? Diğer cevaba benzer şeyler açıklasa bile, cevabınız gönderdiğiniz kodu açıklamanız için yararlıdır. – SuperBiasedMan

+1

@SuperBiasedMan '[[NSURL ayırma] initWithString: @" "]' veya bunun gibi bir şey @John 'un kodu çöktü. –

+2

Güzel yakalamak @SatoshiSuzuki. – John

5

Swift dil için cevap:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    ............... 

    SDWebImageManager.sharedManager().cacheKeyFilter = { url in 
     if url.absoluteString == "" { 
      return "" 
     } 

     let newUrl = NSURL(scheme: url.scheme, host: url.host, path: url.path!)! 
     return newUrl.absoluteString 
    } 

    return true 
} 
0

[NSURL initWithScheme: host: path:] iOS10 önerilmiyor. yerine NSURLComponents kullanılmalıdır.

benim güncellenen çözüm:

SDWebImageManager.sharedManager.cacheKeyFilter = ^NSString *(NSURL *url) { 
    if([[url absoluteString] isEqualToString:@""]){ 
     return @""; 
    } 
    NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO]; 
    urlComponents.query = nil; 
    return [[urlComponents URL] absoluteString]; 
};