// imported for definition purposes only import * as httpRequestModule from "../../http/http-request"; import * as common from "./image-cache-common"; import { Trace } from "../../trace"; import * as utils from "../../utils/utils"; let httpRequest: typeof httpRequestModule; function ensureHttpRequest() { if (!httpRequest) { httpRequest = require("../../http/http-request"); } } class MemmoryWarningHandler extends NSObject { static new(): MemmoryWarningHandler { return super.new(); } private _cache: NSCache; public initWithCache(cache: NSCache): MemmoryWarningHandler { this._cache = cache; NSNotificationCenter.defaultCenter.addObserverSelectorNameObject( this, "clearCache", "UIApplicationDidReceiveMemoryWarningNotification", null ); if (Trace.isEnabled()) { Trace.write( "[MemmoryWarningHandler] Added low memory observer.", Trace.categories.Debug ); } return this; } public dealloc(): void { NSNotificationCenter.defaultCenter.removeObserverNameObject( this, "UIApplicationDidReceiveMemoryWarningNotification", null ); if (Trace.isEnabled()) { Trace.write( "[MemmoryWarningHandler] Removed low memory observer.", Trace.categories.Debug ); } super.dealloc(); } public clearCache(): void { if (Trace.isEnabled()) { Trace.write( "[MemmoryWarningHandler] Clearing Image Cache.", Trace.categories.Debug ); } this._cache.removeAllObjects(); utils.GC(); } public static ObjCExposedMethods = { clearCache: { returns: interop.types.void, params: [] }, }; } export class Cache extends common.Cache { private _cache: NSCache; //@ts-ignore private _memoryWarningHandler: MemmoryWarningHandler; constructor() { super(); this._cache = new NSCache(); this._memoryWarningHandler = MemmoryWarningHandler.new().initWithCache( this._cache ); } public _downloadCore(request: common.DownloadRequest) { ensureHttpRequest(); httpRequest.request({ url: request.url, method: "GET" }).then( (response) => { try { const image = UIImage.alloc().initWithData( response.content.raw ); if (image) { this._onDownloadCompleted(request.key, image); } else { this._onDownloadError( request.key, new Error("No result for provided url") ); } } catch (err) { this._onDownloadError(request.key, err); } }, (err) => { this._onDownloadError(request.key, err); } ); } public get(key: string): any { return this._cache.objectForKey(key); } public set(key: string, image: any): void { this._cache.setObjectForKey(image, key); } public remove(key: string): void { this._cache.removeObjectForKey(key); } public clear() { this._cache.removeAllObjects(); utils.GC(); } }