Измененные события не запускаются в Couchbase Lite Replication

Как упоминается в заголовке, я пытаюсь написать несколько тестов для своего пользовательского механизма разрешения конфликтов, но у меня возникли некоторые проблемы с репликацией couchbase для игры в мяч.

[Test]
public async Task TestSyncReplicationAsync()
{
    bool replicationAttempted = false;
    bool replicationSuccess = false;
    _secondPull.Changed += (sender, e) =>
    {
        switch (e.Status)
        {
            case ReplicationStatus.Idle:
                replicationSuccess = CheckDocumentReplicatedToSecondDatabase();
                replicationAttempted = true;
                break;
            case ReplicationStatus.Active:
                var a = 1;
                break;
            case ReplicationStatus.Offline:
                var b = 2;
                break;
            case ReplicationStatus.Stopped:
                var c = 3;
                break;
            default:
                break;
        }
    };

    var freshDoc = _firstDb.GetDocument(_testRecordId);
    freshDoc.PutProperties(new Dictionary<string, object>() {
        {"name", "Phil"},
        {"age", "40"},
        {"type", "person"}
    });

    await Task.Run(() =>
    {
        while (!replicationAttempted)
        {
            Debug.WriteLine("Spinning waiting for pull");
        }
    });

    Assert.True(replicationSuccess, "Record was not replicated successfully");
}

Репликации работают, но я дублирую синхронизацию, запустив два сегмента в одном симуляторе, так что проще говоря, создайте запись в первом блоке, дождитесь второго объекта репликации, _secondPullизмените состояние, затем оцените, получил ли он новую запись.

Это первый и самый основной из тестов, которые я выполняю, но хотя запись и синхронизируется. Измененное событие не запускается, и поэтому я не могу завершить тест? Асинхронный цикл while предназначен только для поддержания работоспособности тестового кода. У меня был смешанный успех с прямым:

while(_firstPush.Status == ReplicationStatus.Active)
{
    //DoNothing
}

while(_secondPull.Status == ReplicationStatus.Active)
{
    //DoNothing
}

///CarryOnTest

Однако это не дает повторного успеха, и это ужасно. Иногда отладчик просто вращается бесконечно, в других случаях он просто застревает и убивает VS2013.

Я не верю, что мне чего-то не хватает, но, к сожалению, документация CB отсутствует...

1 ответ

Немного неясно, как вы подключаете свой обработчик событий к событию "Изменено". Если вы используете для разделения экземпляров Couchbase Lite, вам необходимо убедиться, что вы подписались на правильный экземпляр Couchbase Lite для внесения изменений.

Можете ли вы поделиться кодом, где вы подписались на измененное событие?

ОБНОВЛЕНИЕ: Вот фрагмент кода, который реплицирует документы из одного экземпляра CB Lite в другой в том же приложении. В этом случае приложение WPF.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Initialize();
    }

    private void Initialize()
    {
        var cb1 = Manager.SharedInstance.GetDatabase("cb1");
        cb1.Changed += Cb1_Changed;

        var cb2 = Manager.SharedInstance.GetDatabase("cb2");
        cb2.Changed += Cb2_Changed;

        string url = "http://try-cb.cloudapp.net:4984/sync_gateway/";
        var auth = new Couchbase.Lite.Auth.BasicAuthenticator("couchbase", "letmein");

        var push = cb1.CreatePushReplication(new Uri(url));
        push.Continuous = true;
        push.Authenticator = auth;
        push.Start();

        var pull = cb2.CreatePullReplication(new Uri(url));
        pull.Continuous = true;
        pull.Authenticator = auth;
        pull.Start();

    }

    private void Cb2_Changed(object sender, DatabaseChangeEventArgs e)
    {
        var cb2 = Manager.SharedInstance.GetDatabase("cb2");
        var docs = e.Changes
            .Select(id => cb2.GetDocument(id.DocumentId))
            .ToList();

        Debugger.Break();
    }

    private void Cb1_Changed(object sender, DatabaseChangeEventArgs e)
    {
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        var cb1 = Manager.SharedInstance.GetDatabase("cb1");

        var doc = cb1.CreateDocument();
        var props = doc.UserProperties != null ? doc.Properties : new Dictionary<string, object>();
        props["doc"] = new
        {
            type = "test",
            guid = Guid.NewGuid().ToString()
        };

        doc.PutProperties(props);
    }
}
Другие вопросы по тегам