I´m currently trying to integrate DropBox into my application. I could sign in and make a file request.
Now i want to save the whole current directory in a class called directory. this class gets instantiated by the DirectoryViewModel. You can see the numbered prints in the code snippet and the output shows:
1 2 3 END --- folders: 0 files: 0 COUNT ITEMS: 0 4 folders count: 4 : files: 1
so the sequence is wrong ... it should be 3 - 4 - END I don´t know how to fix that issue ... would be awesome if someone could help me figure it out
class Directory{
var files = [file]()
var folders = [folder]()
init()
{
print("2")
if let client = DropboxClientsManager.authorizedClient {
print("3")
// List folder
client.files.listFolder(path: "").response { response, error in
print("4")
if let result = response {
print("Folder contents:")
for entry in result.entries {
if (self.isFile(testStr: entry.pathLower!)){
print("File detected")
self.files.append(file(pathDisplay: entry.pathDisplay!, pathLower: entry.pathLower!, name: entry.name))
} else {
print("Folder detected")
self.folders.append(folder(pathDisplay: entry.pathDisplay!, pathLower: entry.pathLower!, name: entry.name))
}
}
print("folders count: \(self.folders.count) : files: \(self.files.count)")
} else {
print(error!)
}
}
}
}
}
class file{
var pathDisplay: String
var pathLower: String
var name: String
init(pathDisplay: String, pathLower: String, name: String) {
self.pathDisplay = pathDisplay
self.pathLower = pathLower
self.name = name
}
}
class folder{ var pathDisplay: String var pathLower: String var name: String
init(pathDisplay: String, pathLower: String, name: String) {
self.pathDisplay = pathDisplay
self.pathLower = pathLower
self.name = name
}
}
class DirectoryViewModel: NSObject {
var items = [FileFolderItem]()
override init() {
super.init()
print("1")
let directory = Directory()
print("END --- folders: \(directory.folders.count) files: \(directory.files.count)")
for folder in directory.folders{
print("fo")
self.items.append(FolderItem(pathDisplay: folder.pathDisplay, pathLower: folder.pathLower, name: folder.name))
}
for file in directory.files{
print("fi")
self.items.append(FolderItem(pathDisplay: file.pathDisplay, pathLower: file.pathLower, name: file.name))
}
print("COUNT ITEMS: \(items.count)")
}
}
DirectoryViewModel acts as data source in a table view conform to the protocol UITableViewDataSource
extension DirectoryViewModel: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items[section].rowCount
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items[indexPath.section]
switch item.type{
case .file:
if let cell = tableView.dequeueReusableCell(withIdentifier: FileCell.identifier, for: indexPath) as? FileCell {
cell.item = item
return cell
}
case .folder:
if let cell = tableView.dequeueReusableCell(withIdentifier: FolderCell.identifier, for: indexPath) as? FolderCell {
print("folder added name: ")
cell.item = item
return cell
}
}
return UITableViewCell()
}
To expand on what Gereon said, the response
callback for the listFolder
method (and any other of these Dropbox API call methods in the Dropbox SwiftyDropbox SDK ), runs asynchronously.
That does mean that your Directory
initializer may complete before the response
callback fires. So, you should only run any code that depends on the result from the response
block once that response
block does fire (eg, put it inside the response
block).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.