So habe ich schon fast alle Fragen zu SO durchlaufen, und ich habe sie alle zusammen, um eine Methode zu erstellen, die zwei Parameter akzeptiert, zuerst ist die URL
des Bildes zum Download und zur Anzeige in UIImageView
und zweitens ist das Platzhalterbild für das UIImageView
. Ich möchte das Bild speichern, damit es nicht jedes Mal heruntergeladen wird. Ich habe SDWebImage verwendet, um das Bild herunterzuladen, aber ich hatte einige Verwirrung, wenn es darum ging, das Bild im Dokumentenverzeichnis mit SDWebImage zu speichern, also entschied ich mich, es nicht zu benutzen. Ich benutzte dispatch_sync(dispatch_get_main_queue()
und meine Methode sieht nun wie:Bild von einer URL asynchron speichern
- (void)saveImageFromURL:(UIImage*)image:(NSURL*)imageURL {
NSString *url = [imageURL absoluteString];
NSArray *parts = [url componentsSeparatedByString:@"/"];
NSString *filename = [parts lastObject];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", filename]];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:fullPath];
if (fileExists) {
NSLog(@"File already exists");
_myUIImage.image = [UIImage imageNamed:fullPath];
return;
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.myUIImage sd_setImageWithURL:imageURL placeholderImage:image];
UIImage *imageFromURL = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]];
NSData *imageDataNew = UIImagePNGRepresentation(imageFromURL);
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:fullPath contents:imageDataNew attributes:nil];
});
}
}
ich ein paar Fragen haben, ist diese Implementierung gut genug, da ich auf einer App arbeite, die auf App Store sein wird? Wird das Herunterladen des Bilds von der URL asynchron durchgeführt? (Ich weiß, dass ich dispatch_async
verwende, aber muss nur bestätigen). Wenn ja, blockiert das nicht meine Benutzeroberfläche, richtig?
kaum. Da Sie dies in dispatch_get_main_queue tun – heximal
Meinst du zu tippen: '' 'dispatch_sync (dispatch_get_main_queue()' '' ohne die letzte Klammer, oder ist das ein Tippfehler? –
dispatch_sync - wie Sie von ihm erwarten können Name - es wird synchrone. Das heißt, wenn Sie saveImageFromURL aus dem Haupt-Thread aufrufen - es wird geblockt. MoreOver dispatch_get_main_queue() - ist eigentlich ein Haupt-Thread. Ihre Anwendung wird sowieso UI blockieren. – DoN1cK