Unity 6.3
0 онлайн 77 гостей 3 в системе
Вход

IPropertyDatabaseView

интерфейс в UnityEditor.Search

Описание

Интерфейс представления PropertyDatabase.

Идея PropertyDatabase представление похоже на представление файла с отображением в памяти Windows, хотя и гораздо проще. PropertyDatabase представление имеет свой поток файлов, который может получить доступ к PropertyDatabase независимо от других точек зрения. Точки зрения одного PropertyDatabase синхронизированы, так что одновременные доступы разрешены. Однако для того, чтобы одновременные доступы работали правильно, каждый поток должен иметь свой собственный экземпляр представления.

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

using System.Collections.Generic;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

static class Example_IPropertyDatabaseView
{
    // Where the property database will be written.
    const string propertyDatabaseFilePath = "Temp/test_ipropertydatabaseview_db";

    static PropertyDatabase propertyDatabase;

    static void InitializePropertyDatabase()
    {
        // Setup the property database. We configure it with automatic flushing so the file store
        // will be updated automatically after an update.
        propertyDatabase = new PropertyDatabase(propertyDatabaseFilePath, true);
    }

    static void ClearPropertyDatabase()
    {
        propertyDatabase.Clear();
        propertyDatabase.Dispose();
    }

    static PropertyDatabaseRecordKey GetPropertyKey(int id, IPropertyDatabaseView view)
    {
        return view.CreateRecordKey((ulong)id / 100, view.CreatePropertyHash((id % 100).ToString()));
    }

    static object LoadPropertyValue(int id, IPropertyDatabaseView view)
    {
        var recordKey = GetPropertyKey(id, view);
        if (view.TryLoad(recordKey, out object value))
            return value;

        // Fetch the value with the time consuming operation and store it for future
        // accesses.
        value = id.ToString();
        view.Store(recordKey, value);
        return value;
    }

    [MenuItem("Examples/IPropertyDatabaseView/Interface")]
    public static void RunExample()
    {
        InitializePropertyDatabase();
        if (!propertyDatabase.valid)
        {
            Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"PropertyDatabase \"{propertyDatabase.filePath}\" failed to open properly.");
            return;
        }

        // Doing a change on the property database internally opens a view on the actual data,
        // which is non negligible. Therefore, it is advised to open a view once and use it as much as you
        // can.
        // Note: when doing concurrent accesses to the property database, each thread must have its own
        // view instance.
        var allValues = new Dictionary<int, object>();
        using (var view = propertyDatabase.GetView())
        {
            for (var i = 0; i < 1000; ++i)
            {
                var value = LoadPropertyValue(i, view);
                allValues.Add(i, value);
            }
        }

        // Validate everything is in the database
        using (var view = propertyDatabase.GetView())
        {
            for (var i = 0; i < 1000; ++i)
            {
                var key = GetPropertyKey(i, view);
                if (!view.TryLoad(key, out object value))
                    Assert.Fail("Record should be in the database.");
                Assert.AreEqual(i.ToString(), value);
            }
        }

        ClearPropertyDatabase();
    }
}

Дополнительные ресурсы: PropertyDatabase.GetView

Открытые методы

Метод Описание
ClearОчистка всего содержимого PropertyDatabase.
CreateDocumentKeyСоздает ключ документа из идентификатора документа.
CreatePropertyHashСоздает хэш свойства из пути свойства.
CreateRecordKeyСоздает ключ записи из идентификатора документа и пути к свойству.
EnumerateAllПеречисляет все записи, хранящиеся в PropertyDatabase
GetValueFromRecordДесериализация значения записи в соответствующий тип.
InvalidateОтменяет действие одной записи свойства, чтобы она больше не могла быть получена.
InvalidateMaskОтмена действия всех свойств, сохраненных из нескольких документов, соответствующих маске ключа документа.
IsPersistableTypeВозвращает логическое значение, указывающее, может ли тип быть сохранен в резервном файле.
StoreХранит свойство документа.
SyncСинхронизирует представления, чтобы они имели доступ к одному и тому же содержимому.
TryLoadЗагружает одно свойство, уже разрядованное в объект.