提前感谢您的帮助。
我尝试从Dropbox中的CSV下载数据。我能够成功下载数据,但是现在我试图用这些进程封闭/创建函数。也就是说,我想创建一个函数,我下载CSV并将数据作为字符串返回。
我的问题是:我的函数在从Dropbox下载完成之前返回数据变量。因此它不会返回任何东西。即,我将看到评论"返回allData变量"首先,然后"转换为allData变量"下一个。我需要以某种方式扭转这一点。
我看到了两个选项:1)弄清楚如何使用这个异步位(我是Swift的新手并且已经在网上搜索以更好地理解它),或者2)以某种方式构造{ {1}}调用仅在数据完全下载后才执行。
你们对如何前进有任何建议吗?我在下面提供了我的代码。
return
答案 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)
}
}