При передаче MetadataChanges в запрос addSnapshotListener (MetadataChanges metadataChanges, слушатель EventListener) метод:
Указывает, изменяются ли только метаданные (т.е. только Query.getMetadata () изменен) должен вызывать события снимка.
blockquote>Это в основном означает, что каждый раз, когда метаданные изменяются, слушатель срабатывает. Таким образом, в случае ожидающих операций значение переменной
pending
будет изменено.Я хочу знать, как я могу прослушать объект msg, который находится в локальном кэше
blockquote>В этом случае вам следует рассмотреть возможность использования функции SnapshotMetadata isFromCache () [116 ] метод:
Log.d(TAG, "isFromCache: " + documentSnapshot.getMetadata().isFromCache());
Когда я в сети, он печатает:
isFromCache: false
Когда я в автономном режиме, он печатает:
isFromCache: true
Вы не можете сделать это, не полагаясь на стороннюю вещь перед предварительной обработкой . Обычно для этого можно использовать такие вещи, как autoconf
.
Они работают, генерируя другой файл заголовка с директивами #define
, которые указывают на наличие заголовков / библиотек, которые вы хотите использовать.
Обновление для этой темы в случае, если у Вас недавно есть эта проблема: Теперь это возможно с C++ 17, используйте макрос препроцессора __ has_include ()
#if __has_include("MyInclude")
# include "MyInclude"
# define MY_INCLUDE 1
#else
# define MY_INCLUDE 0
#endif
детали здесь:
Вы не можете этого сделать. Фаза предварительной обработки C ++ происходит перед фазой компиляции, поэтому условные конструкции языка C ++ не могут быть полезны для размещения вокруг директив препроцессора, таких как #include.
Если вам нужна условная компиляция, то способ сделать это - использовать #ifdef. Что-то вроде:
#ifdef BOOST_BUILD
#include "somebooststuff.h"
using namespace boost;
#else
#include "somestdstuff.h"
using namespace std;
#endif
где BOOST_BUILD - это символ препроцессора, который вы определяете в своем make-файле или в другом месте.
Вы можете использовать __ cplusplus
макрос, чтобы узнать, с какой версией C ++ вы работаете, в следующем стандарте (C ++ 1x, C ++ 0x не должен быть ) он будет иметь a значение больше 199711L
#if __cplusplus > 199711
using std::regex;
#else
using std::tr1::regex;
#endif