Перейти к основному содержимому

Общие принципы

Отложенные результаты

Некоторые методы SDK, например запросы к справочнику или маршрутизатору, возвращают отложенный результат Future<T>. Для работы с ним сохраните ссылку на Future до завершения операции и подпишитесь через onComplete().

Вызов destroy() можно использовать для явной ранней очистки native-ресурсов, например после получения результата или при размонтировании экрана. Это необязательный шаг для объектов SDK, но он полезен для долгих операций и экранов с частым созданием запросов.

Пример получения объекта из справочника:

import { useEffect, useMemo, useRef, useState } from 'react';
import {
SearchManager,
type Context,
type DirectoryObject,
type Future,
} from '@2gis/dgis-mobile-sdk-full';

function useDirectoryObject(context: Context, id: string) {
const searchManager = useMemo(
() => SearchManager.createOnlineManager(context),
[context],
);
const futureRef = useRef<Future<DirectoryObject | null> | null>(null);
const [object, setObject] = useState<DirectoryObject | null>(null);

useEffect(() => {
return () => searchManager.destroy();
}, [searchManager]);

useEffect(() => {
const future = searchManager.searchById(id);
futureRef.current = future;

future.onComplete(
result => {
future.destroy();
futureRef.current = null;
setObject(result);
},
error => {
future.destroy();
futureRef.current = null;
console.warn(error);
},
);

return () => {
futureRef.current?.destroy();
futureRef.current = null;
};
}, [id, searchManager]);

return object;
}

Подробнее про работу со справочником см. в разделе Справочник.

Потоки значений

Некоторые объекты SDK предоставляют потоки значений. На поток можно подписаться через Channel.subscribe() и отписаться через Connection.disconnect(). Ссылку на Connection нужно хранить, пока подписка активна: если ссылка потеряется, сборщик мусора может удалить JavaScript-объект, и подписка отключится. Подробнее см. в описании класса Connection.

Пример подписки на изменение параметров камеры:

import { useEffect } from 'react';
import type { Map } from '@2gis/dgis-mobile-sdk-full';

function useCameraChanges(map: Map | null) {
useEffect(() => {
if (map === null) {
return;
}

const connection = map.camera.changed.subscribe(change => {
console.log('Camera changed:', change);
});

return () => {
connection.disconnect();
};
}, [map]);
}

Если канал относится к типу StatefulChannel<T>, текущее значение доступно сразу через value:

const currentPosition = map.camera.position;
const currentLoadingState = map.dataLoadingStateChannel.value;