如何编写以下异步函数的回调函数

如何编写以下异步函数的回调函数

问题描述:

我有一个我正在使用的函数如下。我需要来自该异步函数的数据,但如果我尝试使用fullResolutionImageData函数之外的数据,它会出现为零。所以我必须写一个回调。但我不知道如何编写回调。有人可以告诉我如何为下面的异步函数编写回调函数,以便我可以访问别处的数据。你能告诉我如何写一个回调函数,这样我就可以访问fullResolutionImageData异步函数之外的文件。如何编写以下异步函数的回调函数

public func fullResolutionImageData(completion: @escaping (Data?) ->()) { 
    SharedQueues.imageProcessingQueue.addOperation { [path] in 
     let data = try? Data(contentsOf: URL(fileURLWithPath: path)) 
     DispatchQueue.main.async { 
      completion(data) 
     } 
    } 
} 

在我的视图控制器我有一个使用此功能

class ViewController: UIViewController{ 
    func buttonAction(sender:UIButton!){ 
     var photos2: [ImageSource]? 
     var files : [Data] = [] 
     let _ = self.photos2?.map ({completion: path in 
      path.fullResolutionImageData{ data in 
       files.append(data) --> (prints 2) 
      } 
     }) 
     print("(files.count)") --> (prints 0 How do I write callback?) 
    } 
} 
+0

实现你webservice以这种结构方式:https://*.com/a/46081822/3400991按照这个链接指令 –

+0

我建议使用协议/委托模式来通知你的'ViewController' onc e图像处理完成。 – toddg

+0

你可以做一个编辑,并告诉我如何做到这一点。我有点困惑。我是新来的编码,并没有学到太多的协议 – Useruuu

所有u需要的是调度组动作。说明的

func buttonAction(sender:UIButton!){ 
     var photos2: [ImageSource]? 
     var files : [Data] = [] 

     let myGroup = DispatchGroup() 
     let _ = self.photos2?.map ({completion: path in 
      myGroup.enter() 
      path.fullResolutionImageData{ data in 
       files.append(data) --> (prints 2) 
       myGroup.leave() 
      } 
     }) 

     myGroup.notify(queue: DispatchQueue.main) { // 2 
      print("(files.count)") 
     } 
    } 

点点:

调度组用于监测的多个异步任务的完成。就像在你的情况下从你在后台线程上执行的文件路径中获取数据一样。

事情需要注意的:

进入该组应该离开组,无论是否成功在其目标或没有每一个任务。如果进入该组的任何任务未能退出,该线程将被永久阻止。因此请确保fullResolutionImageData始终执行完成块!

编辑:

最后正如评论所指出的David是有意义的使用foreach循环再利用的地图如果u被丢弃的结果

因此使用

func buttonAction(sender:UIButton!){ 
     var photos2: [ImageSource]? 
     var files : [Data] = [] 

     let myGroup = DispatchGroup() 
     photos2?.forEach{ path in 
      myGroup.enter() 
      path.fullResolutionImageData{ data in 
       files.append(data) --> (prints 2) 
       myGroup.leave() 
      } 
     } 

     myGroup.notify(queue: DispatchQueue.main) { // 2 

     } 
    } 
+0

那么我可以在哪里访问函数外的文件数。它是否在dispatch.notify – Useruuu

+1

我知道你刚从OP复制那部分,但是如果你丢弃了返回值,不要使用'map'。如果要保留语法,请使用'forEach'。 –

+0

@useruuu:是的,先生!请仔细阅读答案。 DispatchGroup是一个了不起的工具,只要你知道如何使用它:D –