Before going further I recommend that you brush up on the model-view-controller design pattern. This is formally covered in the "Model-View-Controller" section of "Cocoa Core Competencies".
https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html#//apple_ref/doc/uid/TP40008195-CH32-SW1
There is, however, a lot more information about this technique available from both Apple and non-Apple sources. I'm not in a position to recommend non-Apple resources but on the Apple front I'm a big fan of WWDC 2010 Session 116 Model-View-Controller for iPhone OS.
It's an old 'un but a good 'un.
In my experience the best way to address this issue is to put your networking code at the model layer. That is, have your view controllers simply arrange to display model objects and have the networking code populate and mutate those objects like it would with any other model objects.
This approach has some really important advantages:
It decouples the view controller from the networking, which simplifies your development and makes things easier to test.
It makes it easier to deal with threads, because there's a clear delineation between the model, where threading is an issue, and the view controller, where everything must be running on the main thread.
Like any other MVC setup, it facilitates data coherency; you can have two view controllers showing related information without the world exploding.
Once you do that then you just have to arrange for each view controller to get access to the model. You can do this with a singleton if you like, but personally I'm starting to be won over by the arguments in favour of dependency injection.
IMPORTANT: This design does not mean you have to do your networking in the model objects themselves. It's fine to have controller-style objects working at the model layer.
Share and Enjoy
—
Quinn "The Eskimo!"
Apple Developer Relations, Developer Technical Support, Core OS/Hardware
let myEmail = "eskimo" + "1" + "@apple.com"