2017-11-16 3 views
0

Ich bin neu in Reactive Programming und ich habe ein großes Problem, das ich nicht allein lösen kann ... Ich muss mehrere Video-Assets hochladen und in einer geordneten Reihenfolge, aber ich weiß nicht, wie es geht ich eine Reihe von PHAssets habe und ich versuche, durch jedes Element zu durchlaufen und über das Netzwerk Hier ist mein Code mit Kommentaren bisher senden:Loop mit RxSwift

for item in items { 
        let fileName = item.media.localIdentifier 

        //Observable to generate local url to be used to save the compressed video 
        let compressedVideoOutputUrl = videoHelper.getDocumentsURL().appendingPathComponent(fileName) 

        //Observable to generate a thumbnail image for the video 
        let thumbnailObservable = videoHelper.getBase64Thumbnail(myItem: item) 

        //Observable to request the video from the iPhone library 
        let videoObservable = videoHelper.requestVideo(myItem: item) 

         //Compress the video and save it on the previously generated local url 
         .flatMap { videoHelper.compressVideo(inputURL: $0, outputURL: compressedVideoOutputUrl) } 
        //Generate the thumbnail and share the video to send over the network 
        let send = videoObservable.flatMap { _ in thumbnailObservable } 
         .flatMap { api.uploadSharedFiles(item, filename: fileName, base64String: $0) } 

        //subscribe the observable 
        send.subscribe(onNext: { data in 
         print("- Done chain sharing Video -") 
        }, 
            onError: { error in 
            print("Error sharing Video-> \(error.localizedDescription)") 
        }).disposed(by: actionDisposeBag) 

       } 

Antwort

1

Wenn Sie Ihre Elemente nacheinander in flatMap hochladen, dann Aufzählung verwenden

EDIT: Aufzählung ist nützlich, wenn Sie den Index des Elements müssen wissen, sonst nur flatMap mit einem Argument tun wird.

Observable.from(items) 
    .enumerated() 
    .flatMap() { index, item -> Observable<Item> in 
     return uploadItem(item) 
    } 
    .subscribe(onNext: { print($0) }) 
    .disposed(by: disposeBag) 
+0

Vielen Dank für die hervorragenden Antworten zu vermeiden, habe ich eine Frage, ich habe über concatMap gelesen, es wird in diesem Fall von Nutzen sein? – Bruno

+1

* .concatMap() * auf der obersten Ebene garantiert, dass die Reihenfolge der Elemente downstream der Reihenfolge der * Elemente * entspricht. Überzeugen Sie sich selbst, ob Sie es brauchen. –

1

beobachtbaren Stellen aus der Sammlung Elementen und .flatMap () sie zu Ihrem vorhandenen Code -

Observable 
    .from(items) 
    .flatMap { (item) -> Any in 
    // your code 
     return send 
    } 
    .subscribe(/* your code */) 
    .disposed(by: actionDisposeBag) 
+2

Bitte eine Erklärung hinzufügen Risiko des Löschens –