WWDC 2015 Advanced Nsoperations 세션에서 영감을 얻은 신속한 프레임 워크. 이전에는 @danthorpe에 의해 개발 된 운영 으로 알려져 있습니다. 환상적인 커뮤니티의 많은 도움을 받았습니다.
| 의지 | 그것을 찾을 수있는 곳 |
|---|---|
| 세션 비디오 | Developer.apple.com |
| 오래되었지만보다 완전한 참조 문서 | docs.danthorpe.me/operations |
| 업데이트되었지만 아직 완전한 참조 문서 | 절차 .kit.run/development |
| 프로그래밍 가이드 | Operations.ReadMe.io |
ProcedureKit은 모든 현재 Apple 플랫폼을 지원합니다. 최소 요구 사항은 다음과 같습니다.
ProcessureKit (5.1.0)의 현재 릴리스 버전은 Swift 4.2+ 및 Xcode 10.1을 지원합니다. development 지점은 Swift 5 및 Xcode 10.2와 호환됩니다.
ProcedureKit 은 "다중 모듈"프레임 워크입니다 (Googling을 귀찮게하지 마십시오. 방금 만들었습니다). 내 말은, Xcode 프로젝트에는 여러 대상/제품이 각각 신속한 모듈을 생성한다는 것입니다. ProcedureKitMobile 모듈 중 일부는 크로스 플랫폼이며, 다른 모듈 ProcedureKitNetwork 전용입니다.
ProcedureKit Guide 설치를 참조하십시오.
Procedure Foundation.Operation 입니다. 수단 서브 클래스. 서브 클래식 해야하는 추상 클래스입니다.
import ProcedureKit
class MyFirstProcedure : Procedure {
override func execute ( ) {
print ( " Hello World " )
finish ( )
}
}
let queue = ProcedureQueue ( )
let myProcedure = MyFirstProcedure ( )
queue . add ( procedure : myProcedure )여기서 주요 요점은 다음과 같습니다.
Procedureexecute 재정의하지만 super.execute() 를 호출하지 마십시오.finish() 호출하십시오. 이것은 비동기 적으로 수행 될 수 있습니다.ProcedureQueue 인스턴스에 절차를 추가하십시오. 관찰자는 Procedure 서브 클래스에 첨부됩니다. 수명주기 이벤트가 발생하면 콜백을받습니다. 수명주기 이벤트는 다음과 같습니다. 첨부하고 , 실행하고 , 실행하고, 실행하고 , 취소하고 , 새 작전을 추가하고 , 새 작전을 추가하고 , 마무리 하고 마무리 할 것입니다 .
이러한 방법은 프로토콜에 의해 정의되므로 사용자 정의 클래스는 여러 이벤트를 준수하도록 작성할 수 있습니다. 그러나 관찰자를보다 자연스럽게 추가하기 위해 블록 기반 방법이 존재합니다. 예를 들어, 절차가 완료되는시기를 관찰합니다.
myProcedure . addDidFinishBlockObserver { procedure , errors in
procedure . log . info ( message : " Yay! Finished! " )
} 이 프레임 워크는 또한 BackgroundObserver , TimeoutObserver 및 NetworkObserver 제공합니다.
자세한 내용은 [[관찰자 | 옵저버]]의 위키를 참조하십시오.
조건은 Procedure 서브 클래스에 첨부됩니다. 절차가 실행되기 전에 모든 조건을 비동기 적으로 평가합니다 . 조건이 실패하면 실행 대신 오류로 마무리됩니다. 예를 들어:
myProcedure . add ( condition : BlockCondition {
// procedure will execute if true
// procedure will be ignored if false
// procedure will fail if error is thrown
return trueOrFalse // or throw AnError()
}조건은 상호 배타적 일 수 있습니다. 이는 동일한 제외가 실행되는 다른 작업을 방지하는 자물쇠와 유사합니다.
이 프레임 워크는 다음과 같은 조건을 제공합니다. AuthorizedFor , BlockCondition , MutuallyExclusive , NegatedCondition , NoFailedDependenciesCondition , SilentCondition 및 UserConfirmationCondition ( ProcessureKitMobile ).
[[조건 | 조건]]의 위키 또는 조건에 대한 오래된 프로그래밍 안내서 | 자세한 정보.
기능은 애플리케이션의 장치 또는 사용자 계산 능력에 액세스 할 수있는 능력 또는 잠재적으로 모든 종류의 게이트 리소스를 나타냅니다. 예를 들어, 위치 서비스, 클라우드 키트 컨테이너, 캘린더 등 또는 웹 서비스. CapabiltiyProtocol 은 통합 모델을 제공합니다.
GetAuthorizationStatusProcedure 사용하여 현재 권한 부여 상태를 확인하고AuthorizeCapabilityProcedure 사용하여 액세스를 명시 적으로 요청합니다AuthorizedFor 된 조건으로.예를 들어:
import ProcedureKit
import ProcedureKitLocation
class DoSomethingWithLocation : Procedure {
override init ( ) {
super . init ( )
name = " Location Operation "
add ( condition : AuthorizedFor ( Capability . Location ( . whenInUse ) ) )
}
override func execute ( ) {
// do something with Location Services here
finish ( )
}
} ProcessureKit은 다음 Capability.CloudKit 을 제공 Capability.Location .
작업 (이 프레임 워크의 이전 버전)에서는 더 많은 기능 (캘린더, 건강, 사진, 주소록 등)이 존재했으며, 우리는 여전히 ProcessureKit 에서이를 제공하는 방법을 고려하고 있습니다.
자세한 내용은 Wiki [[Capabilities | Capabilities]] 또는 오래된 프로그래밍 안내서를 참조하십시오.
Procedure log 속성을 통해 노출 된 자체 내부 로깅 기능이 있습니다.
class LogExample : Procedure {
override func execute ( ) {
log . info ( " Hello World! " )
finish ( )
}
}제 3 자 로그 프레임 워크 로깅 및 지원에 대한 자세한 내용은 프로그래밍 안내서를 참조하십시오.
종종 절차는 실행하려면 종속성이 필요합니다. 비동기/이벤트 기반 애플리케이션에서 일반적으로 이러한 종속성은 생성 시간에 알려지지 않을 수 있습니다. 대신 절차가 초기화 된 후에는 주입되어야하지만 실행되기 전에 주입해야합니다. ProcedureKit은 함께 작동하는 일련의 프로토콜 및 유형을 통해이를 지원합니다. 우리는이 패턴이 작은 단일 목적 절차의 구성을 장려하기 때문에 훌륭하다고 생각합니다. 테스트하기가 더 쉬우 며 잠재적으로 재사용을 더 많이 가능하게 할 수 있습니다. 이 프레임 워크 전반에 걸쳐 의존성 주입이 사용되고 장려됩니다.
어쨌든, 첫째, 값은 준비되거나 보류 중일 수 있습니다. 예를 들어, 절차가 초기화되면 모든 종속성이 없을 수 있으므로 보류 상태에 있습니다. 잘만되면 그들이 실행될 때까지 준비되기를 바랍니다.
둘째, 절차가 다른 절차에 필요한 종속성을 획득하는 경우 성공할 수 있거나 오류가 발생하지 않을 수 있습니다. 따라서이를 지원하는 간단한 결과 유형이 있습니다.
셋째, input 및 output 속성을 정의하는 프로토콜이 있습니다.
InputProcedure Input 유형을 연관시킵니다. Procedure 서브 클래스는 종속성 주입을 허용하기 위해이를 준수 할 수 있습니다. 따라서 하나의 input 속성 만 지원되므로 여러 종속성을 포함하는 중간 구조 유형을 만듭니다. 물론 input 속성은 보류중인 값 유형입니다.
OutputProcedure output 속성을 통해 Output 연관 유형을 노출시켜 보류중인 결과 유형입니다.
모든 것을 하나로 모으는 것은 InputProcedure 에 대한 API 세트입니다. 이와 같이:
import ProcedureKitLocation
// This class is part of the framework, it
// conforms to OutputProcedure
let getLocation = UserLocationProcedure ( )
// Lets assume we've written this, it
// conforms to InputProcedure
let processLocation = ProcessUserLocation ( )
// This line sets up dependency & injection
// it automatically handles errors and cancellation
processLocation . injectResult ( from : getLocation )
// Still need to add both procedures to the queue
queue . add ( procedures : getLocation , processLocation ) 위에서 Input 유형이 Output 유형,이 경우 CLLocation 일치한다고 가정합니다. 그러나 폐쇄를 사용하여 출력 유형을 필요한 입력 유형으로 마사지 할 수도 있습니다.
import ProcedureKitLocation
// This class is part of the framework, it
// conforms to OutputProcedure
let getLocation = UserLocationProcedure ( )
// Lets assume we've written this, it
// conforms to InputProcedure, and
// requires a CLLocationSpeed value
let processSpeed = ProcessUserSpeed ( )
// This line sets up dependency & injection
// it automatically handles errors and cancellation
// and the closure extracts the speed value
processLocation . injectResult ( from : getLocation ) { $0 . speed }
// Still need to add both procedures to the queue
queue . add ( procedures : getLocation , processLocation ) 좋아, 방금 무슨 일이 있었나요? injectResult API에는 후행 폐쇄를 수용하는 변형이 있습니다. 폐쇄는 출력 값을 수신하고 입력 값을 반환하거나 오류를 던져야합니다. 따라서 { $0.speed } 사용자의 CLLocation 인스턴스에서 속도 속성을 반환합니다.
여기서 주목해야 할 주요 사항은이 클로저가 동시에 실행된다는 것입니다. 따라서 아무것도 부담하지 않는 것이 가장 좋습니다. 보다 복잡한 데이터 매핑을 수행 해야하는 경우 TransformProcedure 및 AsyncTransformProcedure 확인하십시오.
자세한 내용은 결과 주입에 대한 프로그래밍 안내서를 참조하십시오.