代码之家  ›  专栏  ›  技术社区  ›  Frakcool

迅速关闭和执行令

  •  0
  • Frakcool  · 技术社区  · 6 年前

    我在尝试使用swift为自己的教育目的创建一个应用程序时遇到了一些困难。

    现在我有以下(想要的)执行顺序:

    1. TabVIEW
    2. FirstView控制器-表视图
    3. 签入coredata
      • 如果数据存在,使用闭包更新数组
      • 如果数据不存在,则使用来自API的Alamoire下载数据并将其存储到核心数据中
    4. 辅助视图控制器-集合视图
      • 检查核心数据中是否存在图像数据,如果存在,则从核心数据中加载,否则下载。

    我最苦苦挣扎的问题是知道在一个闭包结束后(同步地)执行代码,还是在执行闭包之前或执行闭包时执行代码。

    例如:

    FirstView控制器

    var response: [DDGCharacter]
    //coreData is an instance of such class
    coreData.load(onFinish: { response in //Custom method in another class
        print("Finished loading")
        self.response = response
    })
    
    print("Executed after loading data from Core Data")
    //If no data is saved, download from API
    if response.count == 0 {
        //Download from API
    }
    

    我做了上述测试,结果相同,10次跑步得到:

    Finished loading
    Executed after loading data from Core Data
    

    在所有的10个,但这可能是因为负载没有花费太多的时间来完成,因此,似乎是同步的,而不是。

    所以我的问题是,执行顺序是否总是与数据量无关?或者它可能会改变?我也做了一些调试,它们都在主线程上执行。我只是想确定我的假设是正确的。

    按照注释中的要求,以下是在 load() 方法:

    func load(onFinish: ([DDGCharacter]) -> ()) {
        var characters: [DDGCharacter] = []
    
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }
    
        let managedContext = appDelegate.persistentContainer.viewContext
    
        let fetchRequest = NSFetchRequest<NSManagedObject> (entityName: "DDGCharacter")
    
        do {
            characters = try managedContext.fetch(fetchRequest) as! [DDGCharacter]
        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }
    
        onFinish(characters)
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Rob Napier    6 年前

    你的实施 load(onFinish:) 是非常令人惊讶和过于复杂的。不过,幸运的是,这有助于证明你所问的观点。

    当有东西调用它时,就执行一个闭包。所以在你的情况下, onFinish 在方法的末尾调用,这使得它是同步的。作为一个“闭包”并不能使任何事情成为异步的。这和调用函数一样。多次调用一个闭包是完全正常的( map 例如这样做)。或者它可能永远不会被召唤。或者可以异步调用。基本上,它就像传递函数一样。

    当我说“它与匿名函数略有不同”时,我只是指“闭包”的“关闭”部分,闭包“关闭”当前环境。这意味着它捕获本地作用域中在闭包中引用的变量。这与一个函数稍有不同(尽管它更多的是关于语法,而不是任何真正深入的东西;在某些情况下,函数实际上可以成为闭包)。

    在这种情况下,更好的实现只会返回数组。