当前位置: 首页 > 面试题库 >

如何以正确的方式调度Swift中的函数?

汪同
2023-03-14
问题内容

我一直在努力,但是我不明白。我是编程新手,所以几乎每个新步骤都是一个实验。尽管在没有参数/返回值的情况下调度正常的闭包没有问题,但到目前为止,我还不了解如何处理带有(多个)参数并最终返​​回的函数。

为了弄清楚适当的“解决方法”的逻辑,如果有人可以发布一个实际的示例,这样我就可以确定自己是否正确,那就太好了。我将非常感谢您提供的任何帮助…如果其他一些实际示例以更好的方式说明了该主题,请继续尝试!

假设我们想异步地将以下函数分派到低优先级的后台队列中(或者我犯错了,在定义函数时尝试实现分派,而不是等到从其他地方调用它之前!):

func mutateInt(someInt: Int) -> Int {
    "someHeavyCalculations"
    return result
}

或具有多个参数的函数,该函数另外还会在某个时候调用第一个函数(后台队列中的所有内容):

func someBadExample(someString: String, anotherInt: Int) -> Int {
    "someHeavyStuff"
    println(testString)
    mutateInt(testInt)
    return result
}

或应确保仅在主队列上运行的UI函数(仅是一个虚构的示例):

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {        
    let sectionInfo = self.fetchedResultsController.sections?[section] as NSFetchedResultsSectionInfo       
    return sectionInfo.numberOfObjects
}

问题答案:

假设您有一些类似的功能:

func calculate(foo: String, bar: Int) -> Int {
    // slow calculations performed here

    return result
}

如果要异步执行此操作,则可以将其包装为以下内容:

func calculate(foo: String, bar: Int, completionHandler: @escaping (Int) -> Void) {
    DispatchQueue.global().async {
        // slow calculations performed here

        completionHandler(result)
    }
}

或者,或者,如果您想确保始终在主队列上调用完成处理程序,则也可以这样做:

func calculate(foo: String, bar: Int, completionHandler: @escaping (Int) -> Void) {
    DispatchQueue.global().async {
        // slow calculations performed here

        DispatchQueue.main.async {           
            completionHandler(result)
        }
    }
}

对于在后台执行的工作,您可以使用其他优先级的后台队列,也可以使用自己的自定义队列或自己的操作队列。但是这些细节对于眼前的问题并不是很重要。

与此相关的是,即使基础同步函数会返回此值,该函数本身也不会返回任何值。取而代之的是,这种异步再现通过completionHandler闭包将值传递回去。因此,您可以这样使用它:

calculate(foo: "life", bar: 42) { result in
    // we can use the `result` here (e.g. update model or UI accordingly)

    print("the result is = \(result)")
}

// but don't try to use `result` here, because we get here immediately, before
// the above slow, asynchronous process is done


 类似资料:
  • 问题内容: 我正在使用Scikit-learn在数据集上应用机器学习算法。有时我需要具有标签/类的概率,而不是标签/类本身的概率。我不希望将垃圾邮件/非垃圾邮件作为电子邮件的标签,而仅希望举例说明:给定电子邮件为垃圾邮件的概率为0.78。 为此,我使用RandomForestClassifier如下: 我得到了那些结果: 第二列用于分类:垃圾邮件。但是,我对结果有两个主要问题,对此我不确定。第一个

  • 问题内容: 我正在尝试使我的javascript与快速代码交互,但不幸的是我没有成功。 目前,我只是尝试更改标题的颜色并显示一条消息,如下面的代码所示。 这是我的( index.html )代码: 这是我的( main.js -JavaScript )代码: 这是我的( ViewController.swift )代码: 问题答案: 您已正确设置了所有内容,但没有将实例分配给。由于配置包含Java

  • 问题内容: 输出将是: 看起来,当更改为时,分数将被丢弃。 问题答案: 这里的问题是常量和浮点数的表示形式。 常数以任意精度表示。浮点数使用IEEE 754 标准表示。 规格:常数: 数字常数表示任意精度的值,并且不会溢出。 规格:数值类型: 在IEEE 754中,使用64位(在Go中)的 53位 双精度用于存储数字。这意味着可以表示的最大位数(最大位数)是其中的位数(1位表示符号): 精确到15

  • 我想检查我的pandas列中的字符串是否遵循特定模式。我想用一个函数check\u模式和一个正则表达式来实现。除前两位后面有一个破折号外,数据只能由位数以外的数字组成。正确值为08-15643。错误值可能为07-456d、04-47897-1、084564等。) 请看一下数据和我的代码: 我的输出应该是原始的数据帧df,带有一个额外的列Correct\u模式。给定数据df后,该列的结果应为True

  • 问题内容: 连接网络后如何向用户显示缓慢的Internet连接注意:不是网络类型(2G,3G,4G,WIFI) 问题答案: 确定您的网络速度-(缓慢的Internet速度) 使用NetworkInfo类,ConnectivityManager和TelephonyManager确定您的网络类型。 从互联网上下载任何文件,并计算花费了多长时间与文件中的字节数。(确定速度检查的唯一方法) 我已经为我的项

  • 我正在尝试使用设置log4j2以写入日志。我希望以编程方式配置日志记录系统,而不是使用XML文件。 以下是我尝试过的内容(大部分与网站上的文档相同)https://logging.apache.org/log4j/2.x/manual/customconfig.html#Configurator): 我在main方法的开头调用方法。当我运行我的程序时,会创建一个名为的文件,但是所有日志输出都会转到