简体   繁体   中英

listFolder SwiftyDropbox v2

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM