2014-09-08 15 views
7

Sto utilizzando SDWebImage per memorizzare nella cache le immagini nella mia app, tuttavia di recente ho riscontrato un problema in cui le immagini che devono memorizzare nella cache di. Esaminandoci ho scoperto che l'url completo di immagini di AWS in realtà cambia a causa dei parametri aggiunti alla fine dell'URL. Ogni volta che recupero l'oggetto che contiene l'url immagine, l'url immagine ritorna con un parametro dinamico "firma" e "scade" (per motivi di sicurezza). Un URL diverso per quanto riguarda la cache delle immagini, ma si noti lo stesso percorso per l'immagine.Ignora parametri di query con SDWebImage

prima operazione di recupero:

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

Fetch again 1 secondo dopo:

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

Qual è il modo migliore per gestire questa situazione? Certo sarebbe fantastico se SDWebImage avesse un'opzione per ignorare parametri di query oltre il percorso del file.

risposta

10

SDWebImage ha un metodo che consente di utilizzare una chiave personalizzata, il che aiuta in questo caso poiché AWS modifica la query ogni volta che viene chiamata.

- (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; 
} 

Per ulteriori lettura: SDWebImage | Using the cache key filter

+0

ha fatto u risolverlo? –

6

risposta 's @ John è molto buona, ma ho incontrato qualche volta si è bloccato.

di seguito è la versione più stabile.

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]; 
}; 

Questo aggiuntivi codice controlla se l'URL è valido. [[NSURL alloc] initWithString:@""] o qualcosa di simile provoca arresti anomali.

+0

Potresti spiegare la tua risposta, anche se spiegherà cose simili all'altra risposta, è utile che la tua risposta spieghi il codice che hai pubblicato. – SuperBiasedMan

+1

@SuperBiasedMan '[[NSURL alloc] initWithString: @" "]' o qualcosa del genere che si è schiantato sul codice di @John. –

+2

Bella cattura @SatoshiSuzuki. – John

5

La risposta per la lingua Swift:

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:] è deprecato in iOS10. dovrebbe invece usare NSURLComponents.

mia soluzione aggiornata:

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]; 
}; 
Problemi correlati