如何在 nativescript angular 中实现图像缓存
Posted
技术标签:
【中文标题】如何在 nativescript angular 中实现图像缓存【英文标题】:How to implement image caching in nativescript angular 【发布时间】:2020-08-08 14:51:03 【问题描述】:我正在使用 Angular 实现 Nativescript 应用程序,并且想要进行图像缓存。 Nativescript 文档仅显示如何使用视图而不是角度。我找到了这个主题:how do i cache images in nativescript angular 但答案看起来不太有希望,因为 1) 局部函数 2) 感觉它没有 OnPush 策略
上面提到的所有内容我认为 Observables 应该是可行的方法。所以我确实有一些 ImageCahceService
import Cache from 'tns-core-modules/ui/image-cache';
import ImageSource, fromNativeSource from 'tns-core-modules/image-source';
import Injectable from '@angular/core';
import Observable from 'apollo-link';
@Injectable( providedIn: 'root' )
export class ImageCacheService
private cache: Cache;
constructor()
this.cache = new Cache();
this.cache.placeholder = ImageSource.fromFileSync('~/assets/images/temp-icon.jpg');
this.cache.maxRequests = 10;
get(url: string): Observable<any>
this.cache.enableDownload();
return new Observable(observer =>
const imageFromCache = this.cache.get(url);
if (imageFromCache)
observer.next(imageFromCache);
observer.complete();
this.cache.disableDownload();
return;
this.cache.push(
key: url,
url,
completed: (image: any, key: string) =>
if (url === key)
observer.next(new ImageSource(image));
observer.complete();
this.cache.disableDownload();
);
);
消费将是 但是使用此代码应用程序会冻结并崩溃。
如果我第一次没有观察到,它不会显示图像,但在第二次访问时它会显示 - 这很清楚为什么 - 因为图像在缓存中完全可用。
那么谁能帮我解决这个问题?
附言奖金问题 - 如果 Observables 是把 cache.disableDownload() 放在哪里的方法?
谢谢
【问题讨论】:
最好保留现有插件的缓存,你试过github.com/VideoSpike/nativescript-web-image-cache 【参考方案1】:最后我能够使用 observables 进行图像缓存,但还有一些问题:
this.cache.enableDownload();和 this.cache.disableDownload();处于正确的位置 出于某种原因,如果我不添加 cd.detectChanges(); 这是我的管道:
import Pipe, PipeTransform, ChangeDetectorRef from '@angular/core';
import Cache from 'tns-core-modules/ui/image-cache';
import ImageSource, fromNativeSource from 'tns-core-modules/image-source';
import Observable from 'rxjs';
@Pipe(
name: 'fromCache',
pure: true,
)
export class ImageCachePipe implements PipeTransform
private cache: Cache;
constructor(private cd: ChangeDetectorRef)
this.cache = new Cache();
this.cache.placeholder = ImageSource.fromFileSync('~/assets/images/temp-icon.jpg');
this.cache.maxRequests = 10;
transform(url: string): any
this.cache.enableDownload();
return new Observable(observer =>
const imageFromCache = this.cache.get(url);
if (imageFromCache)
observer.next(imageFromCache);
observer.complete();
this.cache.disableDownload();
return;
observer.next(this.cache.placeholder);
this.cache.push(
key: url,
url,
completed: (image: any, key: string) =>
if (url === key)
observer.next(new ImageSource(image));
observer.complete();
this.cache.disableDownload();
this.cd.detectChanges();
);
);
【讨论】:
以上是关于如何在 nativescript angular 中实现图像缓存的主要内容,如果未能解决你的问题,请参考以下文章
如何在 nativescript angular 中实现图像缓存
如何使用 Angular 在 NativeScript 中使用 XML 而不是 Html 进行设计?
如何在Angular中销毁Nativescript生命周期的applicationOn事件
如何在 NativeScript Angular 应用程序中初始化 Firebase 推送通知
如何在 nativescript-angular html 文件中添加水平线
如何让 Jest 正确转换 node_modules/@nativescript/core? Jest + NativeScript + Angular + Nx