把sharedLoader函数转换成一个正常的函数

我有一个imageLoader函数,加载图像,而其他代码保持运行。 现在我希望同一个函数在所有其他代码保持运行之前先运行。

这是function:

//调用函数

ImageLoader.sharedLoader.imageForUrl(urlstring as String, completionHandler:{(image: UIImage?, url: String) in self.productImageView.image = image! }) 

//函数本身

 func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in var data: NSData? = self.cache.objectForKey(urlString) as? NSData if let goodData = data { let image = UIImage(data: goodData) dispatch_async(dispatch_get_main_queue(), {() in completionHandler(image: image, url: urlString) }) return } var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in if (error != nil) { completionHandler(image: nil, url: urlString) return } if data != nil { let image = UIImage(data: data) self.cache.setObject(data, forKey: urlString) dispatch_async(dispatch_get_main_queue(), {() in completionHandler(image: image, url: urlString) }) return } }) downloadTask.resume() }) } 

如何将这个int转换为一个正常的函数,但是是同步的

我只是很快地做了一个函数,它以一个处理函数作为参数并返回同步的结果,但要注意:从API的asynchronous方法是这样的一个原因,它可能需要很长的时间,因此应该运行一个后台队列不要阻塞主队列。 反正这里是一个例子的function:

 func async(handler: Int -> Void) { dispatch_async(dispatch_queue_create("AsyncQueue", DISPATCH_QUEUE_SERIAL)) { NSThread.sleepForTimeInterval(1) handler(3) } } func syncFromAsync<R>(async: (handler: R -> Void) -> Void) -> R { let group = dispatch_group_create() var result : R! func handler(r : R) { result = r dispatch_group_leave(group) } dispatch_group_enter(group) async(handler: handler) dispatch_group_wait(group, DISPATCH_TIME_FOREVER) return result } print(syncFromAsync(async)) 

基本上你创build一个dispatch_group并input它,提供一个处理程序,让你离开这个dispatch_group并等待组离开。 Swiftgenerics与此非常吻合。

有关它如何工作的更多细节:

创build一个可以进入或离开的分派组,我们也可以通过调用dispatch_group_wait等到分派组为空。

在我的函数中,结果types是R ,它也是处理程序接受的types。 我声明一个函数作为我的处理程序,就像任何其他asynchronous函数的处理程序,而不是做结果的东西,它只是将其存储在可选的result ,然后给出的信号,该组被留下,哪将恢复我们的等待命令。

所以我们进入组,告诉asynchronous函数用处理器做它的事情,等待它完成,而我们知道当处理器被调用并且因此组离开时完成。