如何使返回等到计算完成

时间:2016-03-12 04:43:08

标签: swift csv asynchronous return dropbox

提前感谢您的帮助。

我尝试从Dropbox中的CSV下载数据。我能够成功下载数据,但是现在我试图用这些进程封闭/创建函数。也就是说,我想创建一个函数,我下载CSV并将数据作为字符串返回。

我的问题是:我的函数在从Dropbox下载完成之前返回数据变量。因此它不会返回任何东西。即,我将看到评论"返回allData变量"首先,然后"转换为allData变量"下一个。我需要以某种方式扭转这一点。

我看到了两个选项:1)弄清楚如何使用这个异步位(我是Swift的新手并且已经在网上搜索以更好地理解它),或者2)以某种方式构造{ {1}}调用仅在数据完全下载后才执行。

你们对如何前进有任何建议吗?我在下面提供了我的代码。

return

1 个答案:

答案 0 :(得分:0)

我建议在您的功能中添加completionHandler。您可以在swift文档中了解有关闭包的更多信息。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

func downloadFile (completion: (data: [[String:String]]?, error: NSError?) -> ()) -> (){

var allData = [[String:String]]()

if let client = Dropbox.authorizedClient {

    let destination : (NSURL, NSHTTPURLResponse) -> NSURL = { temporaryURL, response in

        let fileManager = NSFileManager.defaultManager()
        let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]

        // generate a unique name for this file in case we've seen it before

        let UUID = NSUUID().UUIDString

        let pathComponent = "\(UUID)-\(response.suggestedFilename!)"

        print ("The path component is \(pathComponent)")

        return directoryURL.URLByAppendingPathComponent(pathComponent)

    }

//Option 1: Create some bit of asynchronous code here?
    client.files.download(path: "/Master Test.csv", destination: destination).response { response, error in

        if let (metadata, url) = response {

            print("*** Download file ***")

            let data = NSData(contentsOfURL: url)
            let dlString = NSString(data: data!, encoding: NSUTF8StringEncoding)

            let a = CSwiftV(String: String(dlString!))

            allData = a.keyedRows!

            print ("converted to allData variable")

//Option 2: Somehow embed the return call here?
            completion(data: allData, error: nil)

        } else {

            print (error!)
            completion(data: nil, error: error)

        }
    }
}

print ("returned allData variable")

return allData

}

函数调用

 downloadFile(){
  //start your loader here
            dropboxData in
           //remove here
            if(dropboxData.error == nil){
                print(dropboxData.data)
            }else{
                print(dropboxData.error)
            }

        }
相关问题