Я новичок в программировании на Swift, и мой опыт всегда был процедурными языками, поэтому я прихожу к соглашению как с языком, так и с некоторыми концепциями ОО.
Я создаю приложение OSX с 1 графическим интерфейсомокно, с 2 полями ввода и кнопкой - при нажатии кнопки программа берет файлы изображений из папки, введенной в 1 из текстовых полей, и копирует их в папку, введенную во втором текстовом поле.В этом главном окне используется 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")
}
в utilities.swift Функция writeToLog определяется как:
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)
}
Все функции копирования находятся в файле ImageCopy.swift и используют writeToLog ()функция для попытки записи в элемент управления GUI в процессе его выполнения.
Все приложение работает с одним исключением - функция ProcessImages () может занимать так много времени и, насколько я понимаю, работает на главномон блокирует обновления GUI, поэтому, как только функция ProcessImages () возвращает обновления logView NSTextView, все сразу.
Я думаю, что мне нужно запустить функцию ProcessImages () в потоке, однако, когда я это сделалвсе еще не обновлял logView.
Любая помощь будет высоко ценится.
************************************** ОБНОВЛЕНИЕ
Я думаю, что сейчас на правильном пути.Я изучаю делегатов и уведомления для связи между фоновым потоком и представлением пользовательского интерфейса.