SwiftTask(Promise Extension) 사용
14520 단어 Swift
SwiftTask
https://github.com/inamiy/SwiftTask
SwiftTask 정보
SwiftTask는 PromiseKit와 Bolts-iOS와 마찬가지로 Promise가 쓴 흐름 제어 라이브러리입니다.
주로 다음과 같은 특징이 있다.
Progress
, Pause
/Resume
, Cancel
의 새로운 커넥터(Promise 고기능화)Task.all()
등)에서 최소한의 배타 제어만 한다프로그램 라이브러리
progress
pause
cancel
직렬 처리
조화 처리
NSOperation/Queue
×
△실행 중 중단 없음
○
×매우 고통스럽다
×매우 고통스럽다
PromiseKit
×
×
×
○then의 설치가 충분하지 않다?
△when
Bolts-iOS
×
×
○외부token 방식
○
△all만
SwiftTask
△인터페이스만
△인터페이스만
△인터페이스만
○
all,any,some 등
사용 예
SwiftTask에서 작업을 정의할 때(클론 내 초기화) Grand Central Dispatch 등을 사용하여 비동기적으로 처리할 수도 있습니다.
Alamofire(네트워크 라이브러리)로 구성
obj.setProgressHandler()
(callback) obj.setCompletionHandler()
(callback) obj.pause()
obj.resume()
obj.cancel()
Alamofire 사용 예
typealias Progress = (bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
// define task
let task = Task<Progress, NSData?, NSError> { (progress, fulfill, reject, configure) in
let request = Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: somewhere)
request.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
progress((bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) as Progress)
}.response { (request, response, data, error) in
if let error = error {
reject(error)
return
}
fulfill(data as NSData?)
}
configure.pause = { request.suspend() }
configure.resume = { request.resume() }
configure.cancel = { request.cancel() }
return
}
위 코드는 내부용NSURLSessionDownloadTask
의 간단한 다운로드 처리 샘플입니다.초기화
task
할 때 먼저 열네크스로 표시된Progress
,Value (fulfilled)
,Error (rejected)
의 유형(Progress가 반드시 0.0~1.0의 플랫형이 필요하지는 않다)을 결정해야 한다.Task<Progress, Value, Error>
이어 초기화 옷장을 사용하여 내부에서 파라미터 전달progress
,fulfill
,reject
,configure
,fulfill
를 실행한다.이때reject
와 progress
의 호출 방법은 이전의 Promise 때와 같다fulfill
또는 reject
를 호출하기 전에 여러 번 실행할 수 있음(optional)configure
에서 실현pause
,resume
,cancel
task.progress(progressClosure)
(optional)Method Chaining
Promise처럼 method chaining을 진행하는 방법은 다음과 같습니다.
task.progress { progress in
println("bytesWritten = \(progress.bytesWritten)")
println("totalBytesWritten = \(progress.totalBytesWritten)")
println("totalBytesExpectedToWrite = \(progress.totalBytesExpectedToWrite)")
}.then { (value: NSData?) -> Void in
println("fulfilled: \(value)")
}.catch { (errorInfo: ErrorInfo) -> Void in
println("rejected: \(errorInfo.error) \(errorInfo.isCancelled)")
}
progress
우선
task
을 집행한 후progressClosure
에 등록progress
한다.또한 아까 초기화 옷장 안의 매개 변수
progressClosure
처리 프로그램이 실행될 때마다 초기화 옷장 바깥쪽 위치task.progress()
에서 실행되는 구조입니다.참고로
task
의 반환값은 같기 때문then
이므로 후속catch
/task.then(closure)
에 직접 연결할 수 있다.then
closure
는 하나의 task
매개 변수만 받아들이고 새로운task로 돌아가는 방법입니다.기본적으로
closure
가fulfilled라면 promise.then(onFulfilled)
라고 불러야 한다.참, JavaScript Promise의 경우
promise.then(onFulfilled, onRejected)
(fulfilled only) task.then {...}.then {...}
(fulfilled & rejected) ()
형식으로 쓸 수 있음onFulfilled
분할
onRejected
/completionHandler
보다 Apple 흐름으로 통일then
이 API 디자인에 더 좋다closure
수신then
의 유형에 대한 자세한 내용은 README.md를 보십시오.catch
task.catch(closure)
와 마찬가지로 closure
는 task
매개 변수를 수신하고 새로운task를 되돌려줍니다.closure
가rejected일 때만 closure
라고 부른다.여기에
Error
의 매개 변수는 Task.ErrorInfo
대상이 아니라 (error: Error?, isCancelled: Bool)
의 Tuple형이다.보기
errorInfo.isCancelled
를 통해 취소 여부를 판단할 수 있다.Pause/Resume/Cancel
외부에서 대상을 직접 호출하는 각종 방법을 통해 초기화 옷장
configure
에 설치된pause
/resume
를 실행할 수 있다.task.pause()
task.resume()
task.cancel() // task.cancel(error)もできる
취소된cancel
은 내부reject와 거의 같아 task
등으로 포착할 수 있다.번외: Custom Operator 사용
아직 시험적인 실현에 불과하지만
task
,catch
,progress
,then
도 사용자 정의 연산자로 대체할 수 있다.catch
= task ~ {...}
task.progress { progress in ...}
= task >>> {...}
(fulfilled & rejected) task.then { value, errorInfo in ...}
= task *** {...}
(fulfilled only) task.then { value in ...}
= task !!! {...}
(rejected only) task ~ { progress in
...
} *** { (value: NSData?) -> String in
...
} !!! { (errorInfo: ErrorInfo) -> String in
...
} >>> { (value, errorInfo) -> Void in
...
}
Ship it! task.catch { errorInfo in ...}
의 처리 차이가 더욱 뚜렷해졌다.이것도 편할 것 같으니 꼭 써 보세요.
(더 좋은 기법이 있으면 알려주세요.)
Reference
이 문제에 관하여(SwiftTask(Promise Extension) 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/inamiy/items/0756339aee35849384c3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)