IOS swift中的完成块

Posted

技术标签:

【中文标题】IOS swift中的完成块【英文标题】:Completion block in IOS swift 【发布时间】:2015-11-10 09:47:17 【问题描述】:

我正在尝试向自定义函数添加一个可为空的完成块

func disPlayAlertMessage(titleMessage:String, alertMsg:String, completion: (() -> Void)? = nil)

        AlertMessage.alertMessageController = UIAlertController(title: titleMessage, message:
            alertMsg, preferredStyle: UIAlertControllerStyle.Alert)

        AlertMessage.alertMessageController.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default,handler: nil))
        if completion == nil 
            controller.presentViewController(AlertMessage.alertMessageController, animated: true, completion: nil)
         else 
            controller.presentViewController(AlertMessage.alertMessageController, animated: true, completion: 
                completion!()
            )
        
        return

    

当我尝试像下面这样调用上述函数时

AlertMessage(controller: self).disPlayAlertMessage(CustomAlertMessages.AlertTitle, alertMsg: CustomAlertMessages.DOANoUpdate, completion:  () -> Void in
                
                    self.navigationController?.popViewControllerAnimated(true)
                
            )

完成块始终为零。

【问题讨论】:

可以在 controller.presentViewController 之前添加 print-s 吗?确保该值真的为零,并且控制器没有调用它的问题 当我运行它时它会进入 nil 部分,所以显然完成是 nil 您是否设置了断点,或者您假设这是因为未调用完成? 我也试过断点 该方法似乎正确,还有一些其他问题。我复制了你的代码并添加到了一个操场上,它正在工作:func disPlayAlertMessage(titleMessage:String, alertMsg:String, completion: (() -> Void)? = nil) print (titleMessage + alertMsg); completion!() disPlayAlertMessage("Midhun", alertMsg: "MP") () -> Void in print("Yes Working") 【参考方案1】:

这里是你如何定义一个 nil'able 完成

func function(completion: (Void -> Void)? = nil) 
  completion?()

您可以通过几种不同的方式调用它

function() //without any argument

function( //with parens and braces
  print("I will get called")
)

function()  //with parens and braces
  print("I will get called")


function  //without parens
  print("I will get called")

【讨论】:

【参考方案2】:

编辑:仅使用 Swift 2.0 测试..

您应该更改完成参数。

例子:

func Test( completion: () -> () = _ in ) 

    completion()

这个函数可以通过两种不同的方式调用:

Test() // Nothing happens
Test( print("Completed") ) // Prints Completed

希望这会有所帮助:)

【讨论】:

【参考方案3】:

这对我有用

typealias CompletionHandler = (_ success:Bool) -> Void

func yourCompletionBlockName(completionHandler: CompletionHandler) 

         //code
        let flag = true

        completionHandler(flag)
    

在需要时调用完成块

yourCompletionBlockName(completionHandler:  (success) -> Void in

                        if success 
                         else 
                        
)

【讨论】:

以上是关于IOS swift中的完成块的主要内容,如果未能解决你的问题,请参考以下文章

IOS swift中的完成块

如何使用从 Swift 3 中的滑块中选择的 JSON 数据更新 tableviewcell?

Swift - 从完成块中解除视图控制器

内存泄漏,在do-catch块中。 iOS,Swift

快速返回完成块中的变量

如何检测用户何时在 Swift 中完成移动 Range 滑块