2017-09-12 9 views
0

ユーザーが最新表示に切り替えるときにトリガーとなる同期サービスを開発しようとしています。この同期サービスは、サーバーに対して複数の要求を実行します。すべてのAPI呼び出しが完了した後、どのように手動でPromiseKit約束をトリガーできますか?約束のコールバックはすぐに呼び出されています。PromiseKitでSwift 3でPromiseを手動で起動する方法

//MyViewController.swift 
func refresh(sender: AnyObject){ 
    var promise = syncService.syncFromServer() 
    promise.then{ response 
     //This is called immediately, and I need it to wait until the sync is complete 
     refreshControl?.endRefreshing() 
     tableView.reloadData() 
    } 
} 

//SyncService.swift 
func syncFromServer() -> Promise<AsyncResult>{ 
    let promise = Promise(value: AsyncResult) 
    var page = 1 

    //Multiple API calls 
    //let request1 = ... 
    //let request2 = ... 
    //let request3 = ... 
    //How do I tell the returned promise to trigger the associated callbacks after the last API requests has been completed? 

    //Another scenario I need to handle is when the amount of requests is not known ahead of time. 
    while(true){ 
     var response = makeAnApiCall(page) 

     //if the response body says no more data is available, break out of the while loop, and tell any promise callbacks to execute. 
     //if(noMoreData){ 
     // how do I perform something like 
     // promise.complete //This line needs to tell the `then` statement in `MyViewController` to execute. 
     // break 
     //}else{ 
     // do something with response data 
     //} 
     page = page + 1 
    } 

    return promise 
} 
+1

プロミスを手動で開始するとはどういう意味ですか? 'Promise'を正しく返す関数を宣言すると、' then'のときに通常の同期関数のように動作するので、 "callbacks"がすぐに呼び出されると、関数に欠陥があります。あなたの質問に関数定義を含めてください。 –

+0

@DávidPásztor、私は 'syncFromServer'メソッドに説明を追加しました。前もってリクエストの量を知らないシナリオがあります。だから私は、結果がゼロであると答えた後に実行する約束を返す必要があります。だから私は結果がゼロであると判断した後、私は約束のコールバックに実行するよう指示し、whileループから抜け出す必要があります。 – Josh

答えて

0

ここでは、すべてのsyncService呼び出しが実行された後で、テーブルの更新を終了して更新するために必要な作業の例を示しました。 PromiseKitのドキュメントで「いつ」を使用するかを見てください。

func refresh(sender: AnyObject){ 
    syncService.syncFromServer().then { response in 
     refreshControl?.endRefreshing() 
     tableView.reloadData() 
    } 
} 

//SyncService.swift 
func syncFromServer() -> Promise<Void> { 
    let request1 = methodReturningPromise1() 
    let request2 = methodReturningPromise2() 
    return when(fulfilled: [request1, request2]) 
} 

private func methodReturningPromise1() -> Promise<Void> { 
    return syncService.someDataCall().then { response -> Void in 
     //do something here 
    } 
} 
+0

リクエストの量が事前にわからないときに約束を返すことはできますか?予想される応答が返されたときに短絡する可能性のある 'while(true)'ループがあるとします。したがって、ある条件が満たされた後、私はwhileループから抜け出し、約束のリスナーに実行を指示します。 – Josh

+0

はい、trueの場合はPromise(value:())を返し、それ以外の場合は、methodReturningPromise1()などの約束を返すメソッドを返します。 – totiG

関連する問題