All the ways are correct ways depending on your requirement
(1) Executes the method on the same thread on which thread currently your code is executing. (may be background thread or a main thread).
(2) 1 and 2 are pretty same but (2) has advantage that you can dynamically determine which selector to call at runtime.
(3) is same as [NSThread detachNewThread] it creates a new thread (means selector not executed on main thread) generally used for webService image fetching etc.
(4) performs the selector on the main thread (generally used for performing UI changes) if method executed on this thread is too long or heavy it hangs the application for that duration as that method is executed on priority
(5)dispatch async used for doing the task which can be done asynchronously which in your case is using (global queue which are concurrent queues) (not executed on main thread in current case) (like heavy database insertion) background image fetch , those methods which gives you callback later on completion
(6) dispatch sync executes the method synchronously (in your case on main thread) (genrally used for login operations , validation etc.).