Skip to content

Commit 4369a63

Browse files
committed
Improve code using _then() & add comments.
1 parent f8fae1e commit 4369a63

File tree

1 file changed

+38
-40
lines changed

1 file changed

+38
-40
lines changed

SwiftTask/SwiftTask.swift

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -205,16 +205,23 @@ public class Task<Progress, Value, Error>: Printable
205205

206206
self._initClosure = _initClosure
207207

208-
// will be invoked only once
208+
// will be invoked on 1st resume (only once)
209209
self._performInitClosure = { [weak self] in
210210

211+
// strongify `self` on 1st resume
211212
if let self_ = self {
212213

213214
var progressHandler: ProgressHandler
214215
var fulfillHandler: FulfillHandler
215216
var rejectInfoHandler: _RejectInfoHandler
216217

217218
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+
//
218225
progressHandler = { [weak self_] (progress: Progress) in
219226
if let self_ = self_ {
220227
self_._machine.handleProgress(progress)
@@ -234,6 +241,12 @@ public class Task<Progress, Value, Error>: Printable
234241
}
235242
}
236243
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+
//
237250
progressHandler = { (progress: Progress) in
238251
self_._machine.handleProgress(progress)
239252
}
@@ -292,8 +305,8 @@ public class Task<Progress, Value, Error>: Printable
292305

293306
let task = self.progress { _, progressValue in
294307
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
297310
}
298311

299312
task.progress { _, progressValue in
@@ -353,7 +366,7 @@ public class Task<Progress, Value, Error>: Printable
353366
///
354367
public func then<Progress2, Value2>(thenClosure: (Value?, ErrorInfo?) -> Task<Progress2, Value2, Error>) -> Task<Progress2, Value2, Error>
355368
{
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
357370

358371
//
359372
// NOTE:
@@ -362,24 +375,26 @@ public class Task<Progress, Value, Error>: Printable
362375
// so that `selfMachine`'s `completionHandlers` can be invoked even though `self` is deinited.
363376
// This is especially important for ReactKit's `deinitSignal` behavior.
364377
//
365-
let selfMachine = self!._machine
366-
367-
let completionHandler: Void -> Void = {
378+
let selfMachine = self._machine
379+
380+
self._then {
368381
let innerTask = thenClosure(selfMachine.value, selfMachine.errorInfo)
369382
_bindInnerTask(innerTask, newMachine, progress, fulfill, _reject, configure)
370383
}
371384

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-
381385
}.name("\(self.name)-then")
382386
}
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+
}
383398

384399
///
385400
/// success (fulfilled) + closure returning value
@@ -400,11 +415,12 @@ public class Task<Progress, Value, Error>: Printable
400415
///
401416
public func success<Progress2, Value2>(successClosure: Value -> Task<Progress2, Value2, Error>) -> Task<Progress2, Value2, Error>
402417
{
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
404419

405-
let selfMachine = self!._machine
420+
let selfMachine = self._machine
406421

407-
let completionHandler: Void -> Void = {
422+
// NOTE: using `self._then()` + `selfMachine` instead of `self.then()` will reduce Task allocation
423+
self._then {
408424
if let value = selfMachine.value {
409425
let innerTask = successClosure(value)
410426
_bindInnerTask(innerTask, newMachine, progress, fulfill, _reject, configure)
@@ -414,15 +430,6 @@ public class Task<Progress, Value, Error>: Printable
414430
}
415431
}
416432

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-
426433
}.name("\(self.name)-success")
427434
}
428435

@@ -447,11 +454,11 @@ public class Task<Progress, Value, Error>: Printable
447454
///
448455
public func failure<Progress2>(failureClosure: ErrorInfo -> Task<Progress2, Value, Error>) -> Task<Progress2, Value, Error>
449456
{
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
451458

452-
let selfMachine = self!._machine
459+
let selfMachine = self._machine
453460

454-
let completionHandler: Void -> Void = {
461+
self._then {
455462
if let value = selfMachine.value {
456463
fulfill(value)
457464
}
@@ -461,15 +468,6 @@ public class Task<Progress, Value, Error>: Printable
461468
}
462469
}
463470

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-
473471
}.name("\(self.name)-failure")
474472
}
475473

0 commit comments

Comments
 (0)