Learn how to use an important construct in Swift called closures, which you often use to provide a block of code that is executed some time in the future.
The reason you sometimes need to use weak self is to avoid retain cycles, where an object (like a view controller) holds an object that has a reference back to the object (like using self within a closure).