2016-05-06 8 views
0

Lassen Sie mich Ihnen einen Einblick in meine Anwendung geben.Swift - Wie mehrere Bilder auf einmal (GCD) abrufen?

Um es kurz zu machen, ich erstelle eine Social-Networking-App. Jeder Beitrag besteht aus einem Bild, Profilbild und Bildunterschrift. Jeder Beitrag existiert in meiner MySQL-Datenbank. Ich verwende mein eigenes Framework, um jeden Beitrag abzurufen. Sobald ich jedoch jeden Beitrag abgerufen habe, muss ich noch das Profilbild und Bild mit den URLs abrufen, die ich aus der Datenbank abgerufen habe. Ich möchte alle Bilder auf einmal abrufen, anstatt in der Reihenfolge zu laufen.

Ab sofort gibt es etwa 5 Posts in der Datenbank. Das Laden der notwendigen Bilder für eine Post dauert etwa 4 Sekunden. Im Moment lade ich die Bilder für einen Post und lade dann den nächsten in der Reihenfolge ein. Der gesamte Vorgang dauert also etwa 20 Sekunden. Sagen wir 50 Beiträge, dann dauert es extrem lange, alle Beiträge zu laden. Ich habe etwas Wissen von GCD (Grand-Dispatch-Warteschlangen) aber ich weiß nicht, wie es in meiner App zu implementieren.

Hier ist mein Code meine Beiträge und Bilder zum Abrufen:

ConnectionManager.sharedInstance.retrievePosts(UserInformationInstance.SCHOOL) { 
     (result: AnyObject) in 
     if let posts = result as? [[String: AnyObject]] { 
      print("Retrieved \(posts.count) posts.") 
      for post in posts { 
       let postIDCurrent = post["id"] as? Int 
       var UPVOTES = 0; 
       var UPVOTED: Bool! 
       var query = "" 

       if let profilePictureCurrent = post["profile_picture"] { 
        // Loading profile picture image 

        let url = NSURL(string: profilePictureCurrent as! String) 
        let data = NSData(contentsOfURL: url!) 
        let image = UIImage(data: data!) 
        UserInformationInstance.postsProfilePictures.append(image!) 
        print("added profile pic") 
       } else { 
        print("error") 
       } 
       if let postPictureCurrent = post["image"] { 
        if (postPictureCurrent as! String != "") { 
        // Loading image associated with post 

        let url = NSURL(string: postPictureCurrent as! String) 
        let data = NSData(contentsOfURL: url!) 
        let image = UIImage(data: data!) 
        let imageArray: [AnyObject] = [postIDCurrent!, image!] 
        UserInformationInstance.postsImages.append(imageArray) 
        print("added image pic") 
        } 
       } else { 
        print("error") 
       } 
       UserInformationInstance.POSTS.append(post) 
      } 
     } else { 
      self.loadSearchUsers() 
     } 
    } 

Also meine Frage ist, wie kann ich alle Bilder gleichzeitig abrufen statt einer nach dem anderen abzurufen?

Es wäre toll, wenn jemand eine Erklärung sowie einige Code :)

+0

Ist mein Verständnis korrekt? Sie erhalten die Bilder vom Remote-Service? –

+0

@Melifaro Ja, ich erhalte die Bilder von meinem AWS-Server. –

Antwort

1

geben könnte ich Ihren Ansatz zu überarbeiten würde empfehlen. Wenn Ihr Server in Ordnung ist - er ist nicht ausgelastet und gut erreichbar, so dass das Herunterladen von Ressourcen durch die Bandbreite des Netzwerkadapters des Geräts begrenzt ist (X Mbps), spielt es keine Rolle, wie Sie Bilder gleichzeitig oder nacheinander herunterladen.

Lassen Sie mich das zeigen. Download-Zeit von 10 Dateien mit einer Größe von Y mb gleichzeitig gleich Zeit einer Datei auf das Herunterladen, aber in diesem Fall ist die Download-Geschwindigkeit wird 10 Mal pro Datei langsamer sein:

X/10 - downloading speed per one file 
Time = Amount/Speed 
T = Y/(X/10) = 10 * Y/X 

Nun, wenn Ihr das Herunterladen sequently:

Ich würde empfehlen, Beiträge sofort anzuzeigen, sobald Sie sie aus dem Speicher abgerufen, dann müssen Sie beginnen, Bild herunterladen asynchron herunterladen und Bild einmal festgelegt, das heruntergeladen wird. Das ist die beste Vorgehensweise in der Branche, denke Facebook, Twitter, Instagram-Apps.

+0

Hallo, Entschuldigung für die Antwort so spät. Wie auch immer, ich möchte sichergehen, dass ich verstehe, was du sagst. Zunächst möchte ich Ihnen für die klare Erklärung zum Herunterladen von Geschwindigkeiten danken. Das wäre also ein gutes System zum Herunterladen von Bildern: Wenn sich der Benutzer das erste Mal anmeldet, lädt er alle Posts und speichert sie auf dem Gerät. Wenn sich der Benutzer das nächste Mal anmeldet, lädt er alle neuen Beiträge und lädt die alten aus dem Speicher. –

+0

Das ist eine gute Idee, Posts in die DB zu schreiben, sobald sie geladen sind. Ich würde auch empfehlen, heruntergeladene Bilder in einem "Dateispeicher" -Ordner zu speichern, damit sie beide (Beiträge und Bilder) wiederverwendet werden können.Die Grundidee des Posts besteht darin, die Posts zu trennen, die heruntergeladen werden (json, xml, oder welches Format auch immer Ihr Server verwendet) und Bilder herunterzuladen. Sie können etwas Wertvolles dem Benutzer zeigen, auch wenn Sie keine Bilder heruntergeladen haben. –