Skip to content

Instantly share code, notes, and snippets.

@rayvinly
Created January 11, 2016 18:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rayvinly/ba4484c9515467c63b63 to your computer and use it in GitHub Desktop.
Save rayvinly/ba4484c9515467c63b63 to your computer and use it in GitHub Desktop.
Breaking down responsibilities
import UIKit
// MARK: - User
class User: Equatable, Hashable
{
var id: String
var email: String
var hashValue: Int {
return id.hashValue
}
init(id: String, email: String)
{
self.id = id
self.email = email
}
}
func ==(lhs: User, rhs: User) -> Bool
{
return lhs.email == rhs.email
}
// MARK: - Post
struct Post: Comparable
{
var timestamp = NSDate()
}
func <(lhs: Post, rhs: Post) -> Bool
{
return lhs.timestamp.compare(rhs.timestamp) == .OrderedAscending
}
func ==(lhs: Post, rhs: Post) -> Bool
{
return lhs.timestamp == rhs.timestamp
}
// MARK: - API
class UserManager
{
func loggedInUser() -> User?
{
return User(id: "a", email: "a@a.com")
}
func followersForUser(user: User) -> [User]
{
return [User(id: "b", email: "b@b.com"), User(id: "c", email: "c@c.com")]
}
}
class PostManager
{
func fetchPostsForUser(user: User, completionHandler: (posts: [Post]?, error: ErrorType?) -> ())
{
// ...
}
}
// MARK: - View Controller
class ViewController: UITableViewController
{
let userManager = UserManager()
let postManager = PostManager()
var recentPosts = [Post]()
@IBOutlet weak var loginButton: UIButton!
override func viewDidLoad()
{
super.viewDidLoad()
displayFollowerPosts()
}
// MARK: - Steps to follow
func displayFollowerPosts()
{
if let currentUser = userManager.loggedInUser() {
let followers = userManager.followersForUser(currentUser)
fetchPostsByAllFollowers(followers, completionHandler: { (posts: [Post]?, error: ErrorType?) -> () in
if let error = error {
self.showAlert(error)
} else if let posts = posts {
self.updateFollowerPosts(posts)
}
})
hideLoginButton()
} else {
showLoginButton()
}
}
func updateFollowerPosts(posts: [Post])
{
recentPosts = Array(posts.sort { $0 > $1 }[0...4])
refreshFollowerPosts()
hideLoginButton()
}
// MARK: - Fetch posts
func fetchPostsByAllFollowers(followers: [User], completionHandler: (posts: [Post]?, error: ErrorType?) -> ())
{
var allFollowerPosts = [User: [Post]]()
for follower in followers {
fetchPostsByFollower(follower) { (posts: [Post]?, error: ErrorType?) -> () in
if let error = error {
completionHandler(posts: nil, error: error)
} else if let posts = posts {
allFollowerPosts[follower] = posts
if allFollowerPosts.count == followers.count {
completionHandler(posts: Array(allFollowerPosts.values.flatten()), error: nil)
}
}
}
}
}
func fetchPostsByFollower(follower: User, completionHandler: (posts: [Post]?, error: ErrorType?) -> ())
{
postManager.fetchPostsForUser(follower) { (posts: [Post]?, error: ErrorType?) -> () in
if let error = error {
completionHandler(posts: nil, error: error)
} else if let posts = posts {
completionHandler(posts: posts, error: nil)
}
}
}
// MARK: - UI
func refreshFollowerPosts()
{
tableView.reloadData()
}
func showLoginButton()
{
loginButton.hidden = false
}
func hideLoginButton()
{
loginButton.hidden = true
}
func showAlert(error: ErrorType)
{
// ...
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment