             let _: Task<Void> = async(condition: DelayTaskCondition(timeInterval: 2)) { task in
                 NSOperationQueue.mainQueue().addOperationWithBlock {
                     self.doneLabel.text = "And now for something\ncompletely different..."
-                    task.finish()
+                    task.finish() // we have always to tell when the task is finished
                 }
             }
 

        }
    }
    
    func asyncDone() -> NonFailableTask<Void> {
        return async { task in
            await(self.t4)

            NSOperationQueue.mainQueue().addOperationWithBlock {
                self.doneLabel.text = "Done!"
                self.doneLabel.hidden = false
                
                // we can finish the task on any thread, even the main thread
                task.finish()
            }
        }
    }
   
}
}

extension ViewController {

    func asyncDone() -> NonFailableTask<Void> {
        return async { task in
            await(self.t4)
            
            NSOperationQueue.mainQueue().addOperationWithBlock {
                self.doneLabel.text = "Done!"
                self.doneLabel.hidden = false
                
                // we can finish the task on any thread, even the main thread
                task.finish()
            }
        }
    }

    func asyncLoadImage() -> Task<UIImage> {
        // an observer is not needed to the task finish its job, but to have a network activity indicator at the top would be nice...
        let networkActivityObserver = NetworkActivityTaskObserver(application: UIApplication.sharedApplication())
