스위프트에서 완료 핸들러로 함수를 만들려면 어떻게 해야 합니까?
저는 단지 제가 이것에 어떻게 접근해야 할지 궁금했을 뿐입니다.만약 제가 어떤 기능을 가지고 있고, 그것이 완전히 실행되었을 때 어떤 일이 일어나기를 원한다면, 이것을 어떻게 그 기능에 추가할 수 있을까요?감사해요.
네트워크에서 파일을 다운로드할 수 있는 다운로드 기능이 있으며 다운로드 작업이 완료되면 알림을 받고 싶다고 가정합니다.
typealias CompletionHandler = (success:Bool) -> Void
func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {
// download code.
let flag = true // true if download succeed,false otherwise
completionHandler(success: flag)
}
// How to use it.
downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
})
저는 답을 이해하는 데 어려움을 겪었기 때문에 저와 같은 다른 초보자들도 저와 같은 문제를 가지고 있을 것이라고 생각합니다.
제 솔루션은 상위 답변과 동일하지만 초보자나 일반적으로 이해하는 데 어려움이 있는 사람들에게 조금 더 명확하고 이해하기 쉬웠으면 합니다.
완료 핸들러를 사용하여 함수를 작성하려면 다음과 같이 하십시오.
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
기능을 사용하기 위해
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
출력은 다음과 같습니다.
무언가를 하는 것
타다!!!
간단한 예:
func method(arg: Bool, completion: (Bool) -> ()) {
print("First line of code executed")
// do stuff here to determine what you want to "send back".
// we are just sending the Boolean value that was sent in "back"
completion(arg)
}
사용 방법:
method(arg: true, completion: { (success) -> Void in
print("Second line of code executed")
if success { // this will be equal to whatever value is set in this method call
print("true")
} else {
print("false")
}
})
Swift 5.0 +, 단순하고 짧은
예:
스타일 1
func methodName(completionBlock: () -> Void) {
print("block_Completion")
completionBlock()
}
스타일 2
func methodName(completionBlock: () -> ()) {
print("block_Completion")
completionBlock()
}
사용:
override func viewDidLoad() {
super.viewDidLoad()
methodName {
print("Doing something after Block_Completion!!")
}
}
산출량
블록_완료
Block_Completion 후에 무언가를 하는 중!!
이 용도로 Closures를 사용할 수 있습니다.다음을 시도해 보십시오.
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
어떤 시점에서 우리는 이 함수를 아래와 같이 부를 수 있습니다.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
폐쇄에 대한 자세한 내용은 다음 링크를 참조하십시오.
위에 추가하여 : 후행 폐쇄를 사용할 수 있습니다.
downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
}
완료 핸들러에 결과 값이 필요한 경우 다음과 같이 밑줄로 진행되는 레이블을 포함하는 것이 좋습니다.
func getAccountID(account: String, completionHandler: (_ id: String?, _ error: Error?) -> ()) {
// Do something and return values in the completion handler
completionHandler("123", nil)
}
...이 함수를 입력하면 Xcode가 다음과 같은 결과 값 레이블을 자동으로 채우기 때문입니다.
getAccountID(account: inputField.stringValue) { id, error in
}
주문 제작 완료 핸들러에 대해 조금 혼란스럽습니다.예를 들어, 다음과 같습니다.
네트워크에서 파일을 다운로드할 수 있는 다운로드 기능이 있으며 다운로드 작업이 완료되면 알림을 받고 싶다고 가정합니다.
typealias CompletionHandler = (success:Bool) -> Void
func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {
// download code.
let flag = true // true if download succeed,false otherwise
completionHandler(success: flag)
}
당신의.// download code
계속 비동기식으로 실행됩니다.왜 코드는 당신의 것으로 바로 가지 않습니까?let flag = true
그리고.completion Handler(success: flag)
다운로드 코드가 완료될 때까지 기다리지 않으시겠습니까?
//MARK: - Define
typealias Completion = (_ success:Bool) -> Void
//MARK: - Create
func Call(url: NSURL, Completion: Completion) {
Completion(true)
}
//MARK: - Use
Call(url: NSURL(string: "http://")!, Completion: { (success) -> Void in
if success {
//TRUE
} else {
//FALSE
}
})
언급URL : https://stackoverflow.com/questions/30401439/how-could-i-create-a-function-with-a-completion-handler-in-swift
'programing' 카테고리의 다른 글
임시 파일이 없는 두 프로그램의 다른 출력 (0) | 2023.04.27 |
---|---|
ng serve 명령을 실행할 때 "포트 4200이 이미 사용 중" (0) | 2023.04.27 |
새 줄로 내용을 unix 변수에 파일로 저장 (0) | 2023.04.27 |
이클립스에서 키보드만 사용하여 오류로 이동하는 방법은 무엇입니까? (0) | 2023.04.27 |
iOS 7.0에서 잘못된 컨텍스트 0x0 및 시스템 성능 저하 (0) | 2023.04.27 |