Как использовать функцию when в цикле Promisekit - PullRequest
0 голосов
/ 31 мая 2018

У меня есть набор встреч, и я пытаюсь получить все фотографии для этих встреч из нашего хранилища BLOB-объектов Windows Azure.Во-первых, я хочу получить список больших двоичных объектов с соответствующим назначением встречи, чтобы впоследствии я мог их правильно загрузить и сохранить.

Я использую PromiseKit, но я не совсем уверен, как использовать PromiseKit в цикле:

for appointment in appointments {
  // Get blobs
}

Вот мой код.Любая помощь очень ценится!

func getBlobsPromise(appointmentId: Int32) -> Promise<[BlobDownload]>  {
return Promise { seal in
    var error: NSError?
    var blobDownloads = [BlobDownload]()
    container = AZSCloudBlobContainer(url: URL(string: containerURL)!, error: &error)
    if ((error) != nil) {
        print("Error in creating blob container object. Error code = %ld, error domain = %@, error userinfo = %@", error!.code, error!.domain, error!.userInfo)
        seal.reject(error!)
    }

    let prefix: String = "AppointmentFiles/\(appointmentId)"

    container?.listBlobsSegmented(with: nil, prefix: prefix, useFlatBlobListing: true, blobListingDetails: AZSBlobListingDetails(), maxResults: 150) { (error : Error?, results : AZSBlobResultSegment?) -> Void in

        if error != nil {
            seal.reject(error!)
        }

        for blob in results!.blobs!
        {
            let blobInfo = blob as! AZSCloudBlob
            if blobInfo.blobName.lowercased().contains("jpg") || blobInfo.blobName.lowercased().contains("jpeg") {
                let blobDownload: BlobDownload = BlobDownload(appointmentId: Int(jobId), blob: blobInfo)
                blobDownloads.append(blobDownload)
            }

        }

        seal.fulfill(blobDownloads)
    }
}

}

Это возвращает блобы, как и ожидалось, но я хочу получить все капли для всех встреч, прежде чем продолжить.Вот что я попробовал (среди прочего):

func getBlobsForAllJobs(appointmentIds: [Int32]) -> Promise<[BlobDownload]> {
return Promise { seal in
    let count = appointmentIds.count - 1
    let promises = (0..<count).map { index -> Promise<[BlobDownload]> in
        return getBlobsPromise(agencyCode: agencyCode, appointmentId: appointmentIds[index])
    }
    when(fulfilled: promises).then({ blobDownloads in
        seal.fulfill(blobDownloads)
    })
}

}

РЕДАКТИРОВАТЬ 1

Я решил эту проблему с помощью DispatchGroup и обработчика завершения.Вот код на случай, если кто-то заинтересован.Если есть альтернативные (лучшие) способы сделать это, я бы с удовольствием их услышал.Я парень из #, только что попал в Свифт.

func getBlobsToDownload(appointmentIds: [Int32], completion: @escaping ([BlobDownload]) -> Void) {
var myBlobsToDownload = [BlobDownload]()
let myGroup = DispatchGroup()

for apptId in appointmentIds {
    myGroup.enter()

    getBlobs(appointmentId: apptId) { (blobDownloads) in
        print("Finished request \(apptId)")
        print("Blobs fetched from apptId \(apptId)  is \(blobDownloads.count)")
        for blobDownload in blobDownloads {
            myBlobsToDownload.append(blobDownload)
        }
        myGroup.leave()
    }
}

myGroup.notify(queue: .main) {
    print("Finished all requests.")
    completion(myBlobsToDownload)
}

}

...