Skip to content

Commit 00c70c8

Browse files
committed
fix(ios): retain session and delegate
To ensure the references don't get inadvertently eaten by aggressive garbage collector.
1 parent 2c10705 commit 00c70c8

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/http/http.ios.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,17 @@ class NSURLSessionTaskDelegateImpl extends NSObject
103103
) {
104104
// const method = this._request.HTTPMethod.toLowerCase();
105105
if (data) {
106+
if (this._data) {
106107
this._data.appendData(data);
108+
}
107109

108110
const lastProgress: any = this._lastProgress || {
109111
lengthComputable: false,
110112
total: 0
111113
};
112-
lastProgress.loaded = this._data.length;
114+
if (this._data) {
115+
lastProgress.loaded = this._data.length;
116+
}
113117
if (this._onLoading && !this._loadingSent) {
114118
this._onLoading(lastProgress);
115119
this._loadingSent = true;
@@ -285,10 +289,10 @@ class NSURLSessionTaskDelegateImpl extends NSObject
285289

286290
let content;
287291
let responseText;
288-
if (isTextContentType(returnType)) {
292+
if (this._data && isTextContentType(returnType)) {
289293
responseText = NSDataToString(this._data);
290294
content = responseText;
291-
} else if (types.isString(returnType) && returnType.indexOf('application/json') > -1) {
295+
} else if (this._data && types.isString(returnType) && returnType.indexOf('application/json') > -1) {
292296
// @ts-ignore
293297
try {
294298
responseText = NSDataToString(this._data);
@@ -375,6 +379,8 @@ export function addHeader(headers: Headers, key: string, value: string): void {
375379

376380
export class Http {
377381
static _tasks: Map<string, NSURLSessionDataTask> = new Map();
382+
private _session: NSURLSession;
383+
private _sessionDelegate: NSURLSessionTaskDelegateImpl;
378384

379385
constructor() {
380386
}
@@ -437,21 +443,22 @@ export class Http {
437443
urlRequest.timeoutInterval = options.timeout / 1000;
438444
}
439445

440-
let session = NSURLSession.sessionWithConfigurationDelegateDelegateQueue(
446+
this._sessionDelegate = NSURLSessionTaskDelegateImpl.initWithDebuggerRequestResolveRejectCallbackHeadersLoadingListener(
447+
debugRequest,
448+
urlRequest,
449+
resolve,
450+
reject,
451+
options.onProgress,
452+
options.onHeaders,
453+
options.onLoading
454+
);
455+
this._session = NSURLSession.sessionWithConfigurationDelegateDelegateQueue(
441456
sessionConfig,
442-
NSURLSessionTaskDelegateImpl.initWithDebuggerRequestResolveRejectCallbackHeadersLoadingListener(
443-
debugRequest,
444-
urlRequest,
445-
resolve,
446-
reject,
447-
options.onProgress,
448-
options.onHeaders,
449-
options.onLoading
450-
),
457+
this._sessionDelegate,
451458
null
452459
);
453460

454-
const task = session.dataTaskWithRequest(urlRequest);
461+
const task = this._session.dataTaskWithRequest(urlRequest);
455462
Http._tasks.set(id, task);
456463
if (options.url && debugRequest) {
457464
const request = {

0 commit comments

Comments
 (0)