2015-11-28 2 views
1

Я использую Firebase SDK (2.4.2) для iOS. Следующий код является частью функции didSelectPost(), используемой в объекте SLComposeServiceViewController. Очень важно указать, что это поведение не совпадает с обычным UIViewController (странно, я знаю).Firebase runTransactionBlock() удаляет узел

Предполагая, что следующий базовый код:

override func presentationAnimationDidFinish() { 
     // Retrieving content and identifying type here 
    } 

    override func didSelectPost() { 
     self.myRootRef.runTransactionBlock({ 
      (currentData:FMutableData!) in 
       currentData.value = "test" 

       // Finalizing the transaction 
       return FTransactionResult.successWithValue(currentData) 
      } 
     ) 

     self.extensionContext!.completeRequestReturningItems([], completionHandler: nil) 
    } 

Когда операция завершена node_value полностью исчезает из Firebase. Значение не задано, и узел удален. Это очень странное и неожиданное поведение!

С другой стороны, следующий код работает должным образом.

override func didSelectPost() { 
     self.myRootRef.setValue("test", withCompletionBlock: { 
      (error:NSError?, ref:Firebase!) in 
      if (error != nil) { 
       print("Data could not be saved.") 
      } else { 
       print("Data saved successfully!") 
      } 
     }) 

     self.extensionContext!.completeRequestReturningItems([], completionHandler: nil) 
    } 

Эта проблема не существовала пару дней назад, последний раз я запускал код выше. Есть ли какие-нибудь идеи относительно проблемы?

+0

Дайте мне знать, если мои ответы будут работать для вас. Если это так, отметьте его как принято. Хорошо держать оставшуюся без ответа очередь. –

+0

@DavidEast Я еще не получил время, чтобы проверить ответ. Я, скорее всего, сделаю это в эти выходные, после чего я подтвержу ответ здесь. – Bassem

ответ

2

Если вы установили nil в путь в базе данных Firebase, он будет делать то же самое, что и .removeValue().

При совершении операции вы должны проверить на nil. Поскольку транзакции можно вызвать с помощью nil, если не было записано значение по умолчанию.

myRootRef.runTransactionBlock({ 
    (currentData:FMutableData!) in 
    var value = currentData.value as? Int 
    if value == nil { 
     value = 0 
    } 
    currentData.value = value! + 1 
    return FTransactionResult.successWithValue(currentData) 
}) 

Прочтите Firebase Docs для получения дополнительной информации.

+0

это не решило проблему. Я считаю, что сценарий, с которым я работаю, имеет больше переменных, чем предполагает вопрос. Существует еще одно приложение, которое подписано на изменения событий этого узла. Когда происходит изменение, он захватывает данные и очищает контент. Тем не менее, это не было проблемой до недавнего времени. – Bassem

Смежные вопросы