2017-11-23 2 views
0

Ich bin ein completionhandler innerhalb einer für in Schleife läuft, also ja ein Asynchron-Betrieb in einer Schleife ...completionhandler in für in Schleife

Das ist, warum ich DispatchGroups() enthalten:

for fileName in fileNames { 
    group.enter() 
    let url = URL(fileURLWithPath: "\(self.documentsUrl.path)/\(fileName)") 
    let ref = storage.reference().child("pathTo/\(fileName)") 
    let _ = ref.putFile(from: url, metadata: nil) { metadata, error in 
     print("completed") 
     if let error = error { 
      print("error") 
     } else { 
      print("success") 
     } 
     self.removeFile() 
     group.leave() 
    } 
    } 
    group.notify(queue: .main, execute: { 
     print("finished") 
    }) 

Nun, die Dateipfad existiert, aber ich bekomme keine Drucke in der Konsole, aber ich muss benachrichtigt werden, nachdem jeder asynchrone Vorgang beendet ist. Könnte mir jemand dabei helfen?

+0

Was passiert, wenn Sie alle Ihre für Code in DispatchQueue.main.async {} -Methode statt group.enter eingeben? –

+0

Haltepunkt setzen und sehen, was gedruckt wird. BTW "abgeschlossen" wird gedruckt oder nicht? –

+0

hey, ich habe DispatchQueue.main.async {} und es gibt immer noch kein Drucken in der Konsole..könnte mir jemand sagen, wie man den Callback funktioniert, damit ich auf erfolgreiche/Fehlerereignisse reagieren kann? –

Antwort

0

Ich bin ÜBERNAHME Sie laden zu Firebase.

Paar Dinge zu versuchen: ändern let _ = ref.putFile(from: url...-let uploadObj = ref.putFile(from: url...
Dann, als die letzte Zeile Ihrer for-Schleife dies tun: uploadObj.resume().

Wenn das nicht funktioniert, dann ist meine Vermutung, dass das Framework von Firebase mehrere gleichzeitige Uploads nicht verarbeiten kann. Die Lösung besteht darin, auf das Hochladen jeder Datei zu warten und dann die nächste Datei hochzuladen.

Sie können auch Ihren Code versuchen, aber nur 1 Datei hochladen. Wenn das funktioniert, ist das Problem wahrscheinlich das Problem des gleichzeitigen Uploads. Versuchen Sie es mit 2 und dann weiter, wenn es nicht scheitert. Wenn es schließlich scheitert, dann ist die Gleichzeitigkeit definitiv das Problem.

Wenn Sie darauf bestehen, simultane Uploads zu versuchen, gehen Sie zu Google's documentation on this und implementieren Sie ihre Beispiele, um Uploads zu überwachen. Dann können Sie genau sehen, was mit jedem Upload passiert.

Hier ist ein Update:
This post 's Antwort schlägt auch vor, eins nach dem anderen zu laden.

Verwandte Themen