2016-03-22 12 views
2

In meinem Projekt greife ich auf Bilder von URL zu. In diesen URLs gab ich 2-3 Dummy-URLs, die keine Daten haben. Aber mein Code braucht mehr Zeit für den Zugriff auf & identifiziert, dass es keine ImageData auf der URL gibt. Hier ist der CodeWie Zeitbegrenzung der Funktion einstellen?

func callImageURL(urlString : String) -> UIImage 
{ 


    // define an image 
    var contentImage : UIImage = UIImage(named: "defaultImage.jpg")! 

    // convert String url to NSURL 
    let url = NSURL(string: urlString) 

    // if url exist 
    if (url != nil) 
    { 
     // fetch the imageData from url 
     let data = NSData(contentsOfURL: url!) 

     // if image data exist 
     if (data != nil) 
     { 
      // convert imagedata back to an image 
      contentImage = UIImage(data: data!)! 
     } 
    } 


    return contentImage 
} 

Also meine Frage ist, dass wie kann ich die Ausführungszeit auf meinen Code setzen. ODER Gibt es eine Möglichkeit, meinen Code effizienter zu machen?

+0

sollten Sie Threading verwenden, so dass Ihr Bildschirm nicht in allen Umständen blockieren – techloverr

Antwort

0

Wenn Sie einige zeitaufwendige Funktionen haben, können Sie sie im Hintergrundthread aufrufen und dann die UI im Hauptthread aktualisieren. Code-Beispiel:

func callImageURL(urlString : String, completion: UIImage -> Void) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     var contentImage = UIImage(named: "defaultImage.jpg") 

     if let url = NSURL(string: urlString), data = NSData(contentsOfURL: url) { 
      contentImage = UIImage(data: data) 
     } 

     dispatch_async(dispatch_get_main_queue()) { 
      completion(contentImage!) 
     } 
    } 
} 

callImageURL("your url") {image in 
    //Use your image 
} 
1
NSData(contentsOfURL: url!) 

ist eine synchrone Anforderung so wird es Ihr Haupt-Thread blockiert, bis sie ausgeführt wird. Es gibt auch keine Fehlerüberprüfung, möglicherweise ist Ihre URL 404 oder vielleicht ist es nur timeout in diesem Fall könnte es Ihren Haupt-Thread für leicht über 4 Sekunden blockieren.

Am besten verwenden Sie die neue NSURLSession API, um das Image asynchron herunterzuladen. Auf diese Weise kann die Anfrage auch zwischengespeichert werden und Sie können nach entsprechenden Fehlerrückrufen suchen, ohne Ihren Haupt- Thread zu blockieren.

Ich schlage vor zu überprüfen, Alamofire, die Ihnen mit der Netzwerkanforderung und sogar Fortschritte helfen kann Blöcke.