2016-04-25 18 views
0

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?

+0

kaum. Da Sie dies in dispatch_get_main_queue tun – heximal

+0

Meinst du zu tippen: '' 'dispatch_sync (dispatch_get_main_queue()' '' ohne die letzte Klammer, oder ist das ein Tippfehler? –

+0

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

Antwort

0
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

// *** Load Image from URL Asynchronously without blocking Main thread ***  
UIImage *imageFromURL = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]]; 

    dispatch_async(dispatch_get_main_queue(), ^(void){ 

     // *** Create file path to DocumentDirectory *** 
     NSString * docDirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
     NSString *filePath = [docDirPath stringByAppendingPathComponent:@"myImage.jpg"] 

     // *** Write Image to disk *** 
     BOOL isSaved = [UIImageJPEGRepresentation(image, 1.0f) writeToFile:dirPath atomically:YES]; 
     if(isSaved) 
     { 
      NSLog(@"Image write to disc successfully."); 
     } 
    }); 
}); 
+0

Statt dies kann ich nicht nur die Speicherung von Bildern asynchron wie ich getan habe, was ist der Unterschied zwischen den beiden. Entschuldigung, ich bin neu in der iOS-Entwicklung. – TKutal

+0

Sie können es tun, aber wenn Sie eine Situation haben, die Bild herunterladen, speichern und in 'UIImageView' anzeigen, dann müssen Sie es in' dispatch_async (dispatch_get_main_queue(),^(void) ') nur aktualisieren, sonst wird es nicht spiegeln auf dem Bildschirm.Alle UI-Operation muss nur auf Haupt-Thread durchgeführt werden .. –

+0

Sorry, aber ich verstehe nicht, was Sie vermitteln wollen, Sie wollen sagen, wenn das Bild nicht in meinem Verzeichnis ist, dann wird mein Code nicht – TKutal