Методы делегата Dropbox не вызываются в первый раз

Это я написал в viewDidLoad.

 if DBSession.shared().isLinked() {
        print("already linked")

        initDropboxRestClient()
    }
    else
    {
        print("connecting2")
        DBSession.shared().link(from: self)
        initDropboxRestClient()
    }

а функция initDropboxRestClient() написана ниже.

func initDropboxRestClient() {
    dbRestClient = DBRestClient(session: DBSession.shared())
    dbRestClient.delegate = self
    dbRestClient.loadMetadata("/")

}

Проблема в том, что у меня есть два контроллера представления для отображения имен файлов Dropbox, первый контроллер представления вызывает методы делегата и отлично отображает имена файлов и папок. Но второй нет.

Во втором контроллере представления я заметил, что если я прокручиваю свое табличное представление во втором контроллере представления вверх и вниз, то методы делегата вызываются немедленно, и как только он связан в следующий раз, методы вызываются немедленно.

Итак, впервые методы делегата не вызываются в моем втором контроллере представления Dropbox, вот моя проблема. Заранее спасибо.

Методы делегата restClient следующие.

func restClient(_ client: DBRestClient!, loadedMetadata metadata: DBMetadata!) {
    for file in metadata.contents
    {
        dbMetadataArray.append(file as! DBMetadata)
        fileNamesArray.append((file as AnyObject).filename)
    }
    tableView.reloadData()
    self.myActivityIndicator.stopAnimating()
    self.myActivityIndicator.hidesWhenStopped = true

}

func restClient(_ client: DBRestClient!, loadMetadataFailedWithError error: Error!) {
    print("in loadMetadataFailedWithError method in dropbox email view controller")
    print("Error dscription = %@",[error.localizedDescription])
    let alert = UIAlertController(title: "Go Back.", message: "Try Once Again", preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
    self.myActivityIndicator.stopAnimating()
    self.myActivityIndicator.hidesWhenStopped = true
    tableView.reloadData()
}

person aditya    schedule 05.06.2017    source источник
comment
Пожалуйста, покажите нам реализацию соответствующих методов делегатов... спасибо!   -  person Paulo Mattos    schedule 05.06.2017
comment
Я добавил методы делегата. Спасибо.   -  person aditya    schedule 06.06.2017


Ответы (1)


Есть несколько вещей, которые могут привести к тому, что ваши методы делегата не будут вызываться:

  1. Ваш оставшийся клиент равен нулю или выпускается (например, ARC) преждевременно.
  2. Вы делаете вызов в фоновом потоке, в котором нет цикла выполнения.
  3. В вашем методе делегата, который должен быть вызван, есть опечатка. К сожалению, SDK не предупреждает вас, если не может найти метод делегата для вызова; он просто завершается, никому не сообщая.

Кроме того, обратите внимание, что SDK, который вы используете, использует API v1, который устарел и скоро будет удален:

https://blogs.dropbox.com/developers/2016/06/api-v1-deprecated/

Вы должны переключиться на API v2:

https://www.dropbox.com/developers/documentation

person Greg    schedule 05.06.2017
comment
Отличный ответ;) Я бы только добавил 4-й пункт: он может забыть вызвать tableView.reloadData() внутри своего делегата (при получении новых данных из DropBox). Этот вызов вызовет обновление в соответствующем файле tableView. - person Paulo Mattos; 05.06.2017
comment
Я добавил методы делегата. и вызов перезагрузки есть. - person aditya; 06.06.2017
comment
Ошибка HTTP-загрузки NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9806) Впервые я получаю эту строку в своем журнале. - person aditya; 06.06.2017