iOS Кэширование видео - ручное удаление кеша - PullRequest
3 голосов
/ 28 апреля 2020

У меня есть приложение React Native, которое использует React Native Video с iOS кэшированием . Я работал над методом внутри RCTVideoCache.m , который вручную удалял бы данные определенного ключа кэша. Согласно документации SPTPersistentCache, которую видеотека использует для кэширования, данные могут быть удалены либо блокировкой / разблокировкой файла и , вызвав стирание , либо после проверки исходного кода SPTPersistentCache.h с методом с именем removeDataForKeys .

Я пробовал оба пути, но безуспешно.

В моя первая попытка , я использую wipeLockedFiles . Я создал deleteFromCache() метод внутри RCTVideoCache.m . Поскольку все мои видеофайлы по умолчанию разблокированы, в этом методе я пытаюсь заблокировать файл, соответствующий моим cacheKey и , вызывать стирание для всех заблокированных файлов (которое будет состоять только из моей цели * 1026). * файл), как это продемонстрировано в документации. Этот метод выглядит следующим образом:

- (void)deleteFromCache:(NSString *)cacheKey withCallback:(void(^)(BOOL))handler;
{
  [self.videoCache lockDataForKeys:@[cacheKey] callback:nil queue:nil];
  [self.videoCache wipeLockedFiles];
  NSLog(@"Size = %@", @(self.videoCache.totalUsedSizeInBytes));
  handler(YES);
}

Следующие ошибки приводят к двум ошибкам при компиляции:

/Users/.../MyApp/node_modules/react-native-video/ios/VideoCaching/RCTVideoCache.m:79:20: error: no visible @interface for 'SPTPersistentCache' declares the selector 'lockDataForKeys:callback:queue:'
  [self.videoCache lockDataForKeys:@[cacheKey] callback:nil queue:nil];
   ~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/.../MyApp/node_modules/react-native-video/ios/VideoCaching/RCTVideoCache.m:80:20: error: no visible @interface for 'SPTPersistentCache' declares the selector 'wipeLockedFiles'
  [self.videoCache wipeLockedFiles];
   ~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~

Я действительно понятия не имею, почему эти селекторы не видны из SPTPersistentCache.

В моя вторая попытка , я использую removeDataForKeys () . Опять же, я создал deleteFromCache() метод внутри RCTVideoCache.m , который выглядит следующим образом:

- (void)deleteFromCache:(NSString *)cacheKey withCallback:(void(^)(BOOL))handler;
{
  [self.videoCache removeDataForKeys:@[cacheKey] callback:^(SPTPersistentCacheResponse * _Nonnull response) {
    NSLog(@"Result output: %@", response.output);
    NSLog(@"Error output: %@", [response.error localizedDescription]);
   } onQueue:dispatch_get_main_queue()];
  NSLog(@"Size = %@", @(self.videoCache.totalUsedSizeInBytes));
  handler(YES);
}

В этом втором способе нет ошибок, однако данные Ключ никогда не удаляется. Кроме того, оба NSLog s для ответного выхода null внутри терминала.

Я на 100% уверен, что cacheKey, который я предоставляю моему методу deleteFromCache(), верен и данные, соответствующие ему, существуют. Однако в обоих методах NSLog(@"Size = %@", @(self.videoCache.totalUsedSizeInBytes)); не изменяется, и я также могу вручную проверить, что файл не был удален.

Я действительно застрял и не знаю, что не так с кодом, который я написал в обоих случаях, и почему ни один из них не работает. Буду признателен за любую помощь в этом!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Вы можете удалить все файлы подпапки (tmp/rct.video.cache), повторяя каждый из них:

+ (void)deleteFromCache
{
    NSArray* tmpDirectory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.temporaryCachePath error:NULL];

    for (NSString *file in tmpDirectory) {
        [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@%@", self.temporaryCachePath, file] error:NULL];
    }
}
1 голос
/ 04 мая 2020

Я запустил ваш пример и обнаружил, что вы используете неправильные сигнатуры методов. Эти методы просто не существуют в библиотеке кэширования, их сигнатуры отличаются .

Попробуйте что-то вроде этого:

 - (void)deleteFromCache:(NSString *)cacheKey withCallback:(void(^)(BOOL))handler;
 {
     NSLog(@"Size before = %@", @(self.videoCache.totalUsedSizeInBytes));

     [self.videoCache lockDataForKeys:@[cacheKey] callback:nil onQueue:nil];
     [self.videoCache wipeLockedFilesWithCallback:^(SPTPersistentCacheResponse * _Nonnull response) {
         NSLog(@"Size after = %@, response = %@", @(self.videoCache.totalUsedSizeInBytes), response);
         // Call handler after the files are wiped
         handler(YES);
     } onQueue:nil];
 }

Я понятия не имею, почему второй подход не работает, но NSLog(@"Size = %@", @(self.videoCache.totalUsedSizeInBytes)); наверняка вызывается до того, как произойдет фактическое удаление. В приведенном выше примере я переместил оператор регистрации в замыкание обратного вызова, чтобы он сообщал размер до и после удаления.

...