Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift OSX-从另一个类和线程更新NSTextView_Swift_Multithreading_User Interface - Fatal编程技术网

Swift OSX-从另一个类和线程更新NSTextView

Swift OSX-从另一个类和线程更新NSTextView,swift,multithreading,user-interface,Swift,Multithreading,User Interface,我是Swift编程的新手,我的背景一直都是过程语言,所以我开始接受该语言和一些OO概念 我正在构建一个OSX应用程序,它有一个GUI窗口,有两个输入字段和一个按钮-当单击按钮时,程序会从其中一个文本框中输入的文件夹中获取图像文件,并将其复制到第二个文本框中输入的文件夹中。在这个主窗口上,我们可以看到一个NSTextView,它充当输出日志,以便用户知道副本的进度 ViewController.swift utilities.swift ImageCopy.swift 这3个控件在我的View

我是Swift编程的新手,我的背景一直都是过程语言,所以我开始接受该语言和一些OO概念

我正在构建一个OSX应用程序,它有一个GUI窗口,有两个输入字段和一个按钮-当单击按钮时,程序会从其中一个文本框中输入的文件夹中获取图像文件,并将其复制到第二个文本框中输入的文件夹中。在这个主窗口上,我们可以看到一个NSTextView,它充当输出日志,以便用户知道副本的进度

ViewController.swift 
utilities.swift
ImageCopy.swift
这3个控件在我的ViewController中定义

@IBOutlet var logView: NSTextView!
@IBOutlet weak var sourceFolder: NSTextField!
@IBOutlet weak var targetFolder: NSTextField!
按钮代码为:

@IBAction func ExecuteButtonPressed(_ sender: NSButtonCell){
    utilities.writeToLog(lineOfText: "Copy process starting\n")
    processImages(inputFolder, outputFolder) // <-- This can take some time
utilities.writeToLog(lineOfText: "Copy process ended\n")
} 
所有复制功能都位于ImageCopy.swift文件中,并使用writeToLog()函数在GUI控件运行时尝试写入

应用程序都在一个异常情况下工作-因为ProcessImages()函数可能需要很长时间,而且据我所知,它在主线程上运行,它会阻止GUI更新,因此一旦ProcessImages()函数返回logView NSTextView更新,所有更新都会立即执行

我想我需要在线程上运行ProcessImages()函数,但是当我这样做时,它仍然没有更新日志视图

任何帮助都将不胜感激


**************************************更新


我想我现在走的路是对的。我正在调查代理和通知,以便在后台线程和UI视图之间进行通信。

******************************************更新


我想我现在走的路是对的。我正在调查代理和通知,以便在后台线程和UI视图之间进行通信。

要使您自己的答案对其他与您相同的人有用,您应该通过示例或文档链接进行扩展。:)
class utilities{
    static func writeToLog(lineOfText: String){

    // Get current viewcontroller where the logview textview is
    let vc = (NSApplication.shared.keyWindow?.contentViewController as! ViewController)

    let calendar = Calendar.current
    let time=calendar.dateComponents([.hour,.minute,.second], from: Date())

    let outputLineOfText = "\(time.hour!):\(time.minute!):\(time.second!) - " + lineOfText

    vc.logView.textStorage?.append(NSAttributedString(string: outputLineOfText))
    vc.logView.scrollToEndOfDocument(self)

}