@@ -205,16 +205,23 @@ public class Task<Progress, Value, Error>: Printable
205
205
206
206
self . _initClosure = _initClosure
207
207
208
- // will be invoked only once
208
+ // will be invoked on 1st resume ( only once)
209
209
self . _performInitClosure = { [ weak self] in
210
210
211
+ // strongify `self` on 1st resume
211
212
if let self_ = self {
212
213
213
214
var progressHandler : ProgressHandler
214
215
var fulfillHandler : FulfillHandler
215
216
var rejectInfoHandler : _RejectInfoHandler
216
217
217
218
if weakified {
219
+ //
220
+ // NOTE:
221
+ // When `weakified = true`,
222
+ // each handler will NOT capture `self_` (strongSelf on 1st resume)
223
+ // so it will immediately deinit if not retained in somewhere else.
224
+ //
218
225
progressHandler = { [ weak self_] ( progress: Progress ) in
219
226
if let self_ = self_ {
220
227
self_. _machine. handleProgress ( progress)
@@ -234,6 +241,12 @@ public class Task<Progress, Value, Error>: Printable
234
241
}
235
242
}
236
243
else {
244
+ //
245
+ // NOTE:
246
+ // When `weakified = false`,
247
+ // each handler will capture `self_` (strongSelf on 1st resume)
248
+ // so that it will live until fulfilled/rejected.
249
+ //
237
250
progressHandler = { ( progress: Progress ) in
238
251
self_. _machine. handleProgress ( progress)
239
252
}
@@ -292,8 +305,8 @@ public class Task<Progress, Value, Error>: Printable
292
305
293
306
let task = self . progress { _, progressValue in
294
307
progress ( progressValue)
295
- } . failure { [ weak self] _ -> Task in
296
- return self ! . clone ( ) . try ( maxTryCount- 1 ) // clone & try recursively
308
+ } . failure { [ unowned self] _ -> Task in
309
+ return self . clone ( ) . try ( maxTryCount- 1 ) // clone & try recursively
297
310
}
298
311
299
312
task. progress { _, progressValue in
@@ -353,7 +366,7 @@ public class Task<Progress, Value, Error>: Printable
353
366
///
354
367
public func then< Progress2, Value2> ( thenClosure: ( Value ? , ErrorInfo ? ) -> Task < Progress2 , Value2 , Error > ) -> Task < Progress2 , Value2 , Error >
355
368
{
356
- return Task < Progress2 , Value2 , Error > { [ weak self] newMachine, progress, fulfill, _reject, configure in
369
+ return Task < Progress2 , Value2 , Error > { [ unowned self] newMachine, progress, fulfill, _reject, configure in
357
370
358
371
//
359
372
// NOTE:
@@ -362,24 +375,26 @@ public class Task<Progress, Value, Error>: Printable
362
375
// so that `selfMachine`'s `completionHandlers` can be invoked even though `self` is deinited.
363
376
// This is especially important for ReactKit's `deinitSignal` behavior.
364
377
//
365
- let selfMachine = self ! . _machine
366
-
367
- let completionHandler : Void -> Void = {
378
+ let selfMachine = self . _machine
379
+
380
+ self . _then {
368
381
let innerTask = thenClosure ( selfMachine. value, selfMachine. errorInfo)
369
382
_bindInnerTask ( innerTask, newMachine, progress, fulfill, _reject, configure)
370
383
}
371
384
372
- if let self_ = self {
373
- switch self_. state {
374
- case . Fulfilled, . Rejected, . Cancelled:
375
- completionHandler ( )
376
- default :
377
- self_. _machine. completionHandlers. append ( completionHandler)
378
- }
379
- }
380
-
381
385
} . name ( " \( self . name) -then " )
382
386
}
387
+
388
+ /// invokes `completionHandler` "now" or "in the future"
389
+ private func _then( completionHandler: Void -> Void )
390
+ {
391
+ switch self . state {
392
+ case . Fulfilled, . Rejected, . Cancelled:
393
+ completionHandler ( )
394
+ default :
395
+ self . _machine. completionHandlers. append ( completionHandler)
396
+ }
397
+ }
383
398
384
399
///
385
400
/// success (fulfilled) + closure returning value
@@ -400,11 +415,12 @@ public class Task<Progress, Value, Error>: Printable
400
415
///
401
416
public func success< Progress2, Value2> ( successClosure: Value -> Task < Progress2 , Value2 , Error > ) -> Task < Progress2 , Value2 , Error >
402
417
{
403
- return Task < Progress2 , Value2 , Error > { [ weak self] newMachine, progress, fulfill, _reject, configure in
418
+ return Task < Progress2 , Value2 , Error > { [ unowned self] newMachine, progress, fulfill, _reject, configure in
404
419
405
- let selfMachine = self ! . _machine
420
+ let selfMachine = self . _machine
406
421
407
- let completionHandler : Void -> Void = {
422
+ // NOTE: using `self._then()` + `selfMachine` instead of `self.then()` will reduce Task allocation
423
+ self . _then {
408
424
if let value = selfMachine. value {
409
425
let innerTask = successClosure ( value)
410
426
_bindInnerTask ( innerTask, newMachine, progress, fulfill, _reject, configure)
@@ -414,15 +430,6 @@ public class Task<Progress, Value, Error>: Printable
414
430
}
415
431
}
416
432
417
- if let self_ = self {
418
- switch self_. state {
419
- case . Fulfilled, . Rejected, . Cancelled:
420
- completionHandler ( )
421
- default :
422
- self_. _machine. completionHandlers. append ( completionHandler)
423
- }
424
- }
425
-
426
433
} . name ( " \( self . name) -success " )
427
434
}
428
435
@@ -447,11 +454,11 @@ public class Task<Progress, Value, Error>: Printable
447
454
///
448
455
public func failure< Progress2> ( failureClosure: ErrorInfo -> Task < Progress2 , Value , Error > ) -> Task < Progress2 , Value , Error >
449
456
{
450
- return Task < Progress2 , Value , Error > { [ weak self] newMachine, progress, fulfill, _reject, configure in
457
+ return Task < Progress2 , Value , Error > { [ unowned self] newMachine, progress, fulfill, _reject, configure in
451
458
452
- let selfMachine = self ! . _machine
459
+ let selfMachine = self . _machine
453
460
454
- let completionHandler : Void -> Void = {
461
+ self . _then {
455
462
if let value = selfMachine. value {
456
463
fulfill ( value)
457
464
}
@@ -461,15 +468,6 @@ public class Task<Progress, Value, Error>: Printable
461
468
}
462
469
}
463
470
464
- if let self_ = self {
465
- switch self_. state {
466
- case . Fulfilled, . Rejected, . Cancelled:
467
- completionHandler ( )
468
- default :
469
- self_. _machine. completionHandlers. append ( completionHandler)
470
- }
471
- }
472
-
473
471
} . name ( " \( self . name) -failure " )
474
472
}
475
473
0 commit comments