Как реализовать BOXContentCacheClientProtocol в BOX Content SDK для iOS - PullRequest
0 голосов
/ 19 октября 2018

Я работаю с BOX Content SDK для iOS .BOX обычно рекомендует выполнять какое-либо кэширование результатов API, чтобы снизить риск превышения ограничений регулирования API.Я вижу, что в SDK есть протокол с именем BOXContentCacheClientProtocol, и многие запросы API имеют методы, которые, по-видимому, используют кэшированные результаты.Например, один из запросов на получение информации о папке:

- (void)performRequestWithCached:(BOXFolderBlock)cacheBlock
                       refreshed:(BOXFolderBlock)refreshBlock
{
  if (cacheBlock) {
    if ([self.cacheClient respondsToSelector:@selector(retrieveCacheForFolderRequest:completion:)]) {
      [self.cacheClient retrieveCacheForFolderRequest:self completion:cacheBlock];
    } else {
      cacheBlock(nil, nil);
    }
  }
  [self performRequestWithCompletion:refreshBlock];
}

Мне кажется, что правильным способом реализации retrieveCacheForFolderRequest в клиенте кеша было бы хранить результаты запроса каждой папки в кешеи искать их по какому-то уникальному идентификатору.Если запрос на папку был сделан ранее и имеет результаты в кеше, просто верните кешированные результаты.Примерно так:

- (void)retrieveCacheForFolderRequest:(BOXFolderRequest *)request 
                           completion:(BOXFolderBlock)completionBlock
{
  BOXFolder *cachedResult = [_cache objectForKey:request.folderID];
  if (cachedResult) {
    completionBlock(cachedResult, nil);
  }
}

Однако при поиске источника для executeRequestWithCached успешный поиск кэшированного результата не помешает реализации запроса по-прежнему вызывать API для получения тех же результатов с сервера.

Я что-то упустил?Предполагается ли, что вызывающая функция executeRequestWithCached отменяет запрос, если вызывается cacheBlock?Надеюсь, кто-нибудь из BOX подберет это и даст руководство.

1 Ответ

0 голосов
/ 19 октября 2018

Вы правы в реализации протокола кеша клиента.Для executeRequestWithCached идея заключается в том, что вы заполняете пользовательский интерфейс из блока кэша и обновляете кэш и пользовательский интерфейс после того, как блок обновления в конечном итоге возвращает последние данные из Box API.Однако, если ваш вариант использования состоит в том, чтобы сначала проверить кэш перед выполнением сетевого вызова, подумайте о реализации cacheFolderRequest по протоколу cacheclient (https://github.com/box/box-ios-sdk/blob/master/BoxContentSDK/BoxContentSDK/Protocols/BOXContentCacheClientProtocol.h#L172)

В качестве альтернативы вы все равно можете выполнить executeRequestWithCached с блоком обновления, установленным в ноль (который пропускает сетьпозвоните так https://github.com/box/box-ios-sdk/blob/master/BoxContentSDK/BoxContentSDK/Requests/BOXFolderRequest.m#L132), а затем решите сделать еще один вызов с установленным на этот раз блоком обновления для извлечения данных из сети.

...