macos - 在 ViewController viewDidLoad 之前执行 NSApplicationDelegate 代码

标签 macos cocoa swift3 appdelegate

我的 Swift 3、Xcode 8.2 MacOS 应用程序通过 Web 服务调用加载多个表。由于这些表由我的七个 View Controller 中的一个或多个使用,因此我将它们放置在 AppDelegate 中。

问题在于 AppDelegate 方法 applicationWillFinishLaunchingapplicationDidFinishLaunching 在 ViewController viewDidLoad 方法之后运行。

因此 TableView 不显示任何数据。通过调用从 ViewController viewDidLoad 方法之一加载数据的 appDelegate 方法,我能够使其正常工作。由于任何 ViewController 都可以在应用程序启动时调用,因此我必须添加对所有 ViewController 的调用以及某种标记方法以防止冗余加载。

我的问题是:在哪里可以放置在 ViewController 加载之前执行的代码?该代码将数据加载到多个字典数组中。这些数组位于 AppDelegate 中。

我阅读了 @NSApplicationMain 并将其替换为 main.swift。我假设此时不会实例化任何应用程序对象,因此我无法调用它们的方法,并且认为我的代码在类之外无效。

我的 appDelegate 的相关部分:

class AppDelegate: NSObject, NSApplicationDelegate {

var artists: [[String:Any]]? = nil

var dispatchGroup = DispatchGroup() // Create a dispatch group

func getDataFromCatBox(rest: String, loadFunction: @escaping ([[String: Any]]?) -> Void) {
    let domain = "http://catbox.loc/"
    let url = domain + rest
    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "Get"
    let session = URLSession.shared
    var json: [[String:Any]]? = nil
    dispatchGroup.enter()
    session.dataTask(with: request) { data, response, err in
        if err != nil {
            print(err!.localizedDescription)
            return
        }
        do {
            json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [[String: Any]]
        }
        catch {
            print(error)
        }
        loadFunction(json)
        self.dispatchGroup.leave()
    }.resume()
}

    func loadArtistTable(array: [[String: Any]]?) {
    artists = array
    }
}

ViewController 代码:

override func viewDidLoad() {
    super.viewDidLoad()

    appDelegate = NSApplication.shared().delegate as! AppDelegate
    appDelegate.getDataFromCatBox(rest: "artists.json", loadFunction: appDelegate.loadArtistTable)
    appDelegate.dispatchGroup.wait()
    artistTable.reloadData()
}

该代码的工作原理是在窗口出现时填充 TableView。虽然代码不多,但我必须在所有 View Controller 中进行复制。

这是一个原型(prototype)。生产版本将有 14 个表和调用。

最佳答案

我想我的评论应该是一个答案。所以。为什么不直接让包含表格 View 的窗口在启动时不可见呢?然后在didFinishLaunching中,加载表格数据,然后显示窗口。

关于macos - 在 ViewController viewDidLoad 之前执行 NSApplicationDelegate 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732443/

相关文章:

macos - 在 shell 脚本中抑制信号输出,如 "Abort trap: 6",用于应该崩溃的测试

java - FFmpeg 使用 Java 运行时在 Mac 上使用目录名称中的空格从 PNG 制作视频

c++ - 多线程事件检查器不打印任何东西

macos - 无法通过Apple的Metal Graphics API进行深度测试

objective-c - 任何用于 Objective-C 的 XML 绑定(bind)框架?

javascript - 有什么方法可以停止或暂停 JSContext 对象中 Javascript 的执行?

objective-c - 为什么不使用优化 (-O0) 的 NSArray 访问速度比使用 (-O1, -O2, -O3, -Os, -Ofast) 更快?

Swift FileManager - 没有这样的文件

ios - 表格单元格中的 UIButton "unrecognized selector sent to instance"

swift - 对返回类强制执行通用协议(protocol)约束