2017-09-12 6 views
0

사용자가 새로 고침을 시도 할 때 트리거되는 동기화 서비스를 개발하려고합니다. 이 동기화 서비스는 서버에 대한 여러 요청을 수행합니다. 모든 API 호출이 완료된 후 수동으로 PromiseKit 약속을 트리거 할 수 있습니까? 약속의 콜백은 즉시 호출됩니다. 난 당신이 상쾌 종료하고 모든 syncService 호출을 실행 한 후있는 tableView를 업데이트해야 할 일의 예를 제공 한 아래PromiseKit을 사용하여 Promise에서 Swift 3을 수동으로 트리거하는 방법

//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'을 사용할 때 정상적인 동기 함수와 거의 같은 역할을합니다. 따라서 "콜백"이 즉시 호출되면 함수에 결함이 있습니다. 귀하의 질문에 함수 정의를 포함하십시오. –

+0

@ DávidPásztor,'syncFromServer' 메소드에 설명을 추가했습니다. 미리 요청량을 알 수없는 시나리오가 있습니다. 따라서 응답 결과가 0이라고 말한 후에 실행될 약속을 반환해야합니다. 따라서 결과가 0이라고 판단한 후에는 약속 콜백에 실행을 알리고 while 루프를 중단해야합니다. – Josh

답변

0

. '언제'를 사용하는지 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 (값 :())를 반환하고 그렇지 않으면 promise를 반환하는 메서드 (예 : methodReturningPromise1())를 반환 할 수 있습니다. – totiG