SLComposeServiceViewController обновляет конфигурационные элементы?

#ios #swift

#iOS #swift

Вопрос:

Я следовал этому руководству о том, как настроить a SLComposeViewController , и оно включает в себя информацию о том, как настроить элементы конфигурации.

Я извлекаю данные из базы данных MongoDB, чтобы получить самый последний измененный элемент. Вот мой configurationItems() :

     override func configurationItems() -> [Any]! {
        let configurationItems = [editConfigurationItem]
        
        return configurationItems
    }
  

и вот моя editConfigurationItem переменная:

     lazy var editConfigurationItem: SLComposeSheetConfigurationItem = {
        
        func getFirstCategory(completion: @escaping(String) -> ()) {
            DispatchQueue.main.async {
                let email: String = customKeychainWrapperInstance.string(forKey: "email") ?? ""
                let password: String = customKeychainWrapperInstance.string(forKey: "password") ?? ""
                
                app.login(credentials: Credentials.emailPassword(email: email, password: password)) { (maybeUser, error) in
                    DispatchQueue.main.sync {
                        guard error == nil else {
                            print("Login failed: (error!)");
                            return
                        }
                        
                        guard let _ = maybeUser else {
                            fatalError("Invalid user object?")
                        }
                        print("Login succeeded!");
                    }
                    let user = app.currentUser!
                    let configuration = user.configuration(partitionValue: user.id)
                    let predata = try! Realm(configuration: configuration)
                    let unsortedData = predata.objects(Tiktoks.self)
                    let data = unsortedData.sorted(byKeyPath: "date", ascending: false)
                    let firstCategory = data[0].category
                    let firstCategoryId = data[0]._id
                    print(firstCategory)
                    print(firstCategoryId)
                    self.selectedId = firstCategoryId
                    completion(firstCategory)
                }
            }
            print("done")
        }
        
        let item = SLComposeSheetConfigurationItem()!
        item.title = "collection"
        item.valuePending = true
        getFirstCategory() { (firstCategory) in
            item.valuePending = false
            print("completed")
            item.value = firstCategory // Using self as the closure is running in background
        }
        item.tapHandler = self.editConfigurationItemTapped
        return item
    }()
  

(Извините за беспорядок кода, я новичок в Swift)

Пока это работает, но item.value переменная не обновляется в пользовательском интерфейсе. Он «бесконечно загружается», пока вы не нажмете на элемент конфигурации. Однако, когда элемент конфигурации используется для перехода к другому представлению, фактическая переменная из базы данных отображается на долю секунды, прежде чем показывать следующее представление. Когда вы возвращаетесь из этого другого представления, фактическая переменная есть.

введите описание изображения здесь

Мне кажется, что элемент конфигурации не обновляется. Я вижу, что есть reloadConfigurationItems() , но, поместив это в my editConfigurationItem , я бы подумал, что цикл вызовет цикл (и он также выдает ошибки). В документации даже говорится:

В частности, вам не нужно вызывать этот метод после изменения свойства элемента конфигурации, поскольку базовый класс SLComposeServiceViewController автоматически обнаруживает такие изменения и реагирует на них.

но похоже, что он не обнаруживает изменений.

Есть ли способ обновить item.value и item.valuePending ?