Created
January 11, 2016 18:12
-
-
Save rayvinly/ba4484c9515467c63b63 to your computer and use it in GitHub Desktop.
Breaking down responsibilities
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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