programing

스위프트에서 완료 핸들러로 함수를 만들려면 어떻게 해야 합니까?

skycolor 2023. 4. 27. 22:07
반응형

스위프트에서 완료 핸들러로 함수를 만들려면 어떻게 해야 합니까?

저는 단지 제가 이것에 어떻게 접근해야 할지 궁금했을 뿐입니다.만약 제가 어떤 기능을 가지고 있고, 그것이 완전히 실행되었을 때 어떤 일이 일어나기를 원한다면, 이것을 어떻게 그 기능에 추가할 수 있을까요?감사해요.

네트워크에서 파일을 다운로드할 수 있는 다운로드 기능이 있으며 다운로드 작업이 완료되면 알림을 받고 싶다고 가정합니다.

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)
}

폐쇄에 대한 자세한 내용은 다음 링크를 참조하십시오.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

위에 추가하여 : 후행 폐쇄를 사용할 수 있습니다.

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

반응형