FOTask is a microframework (less than 100 LOCs), with a single objective in mind: separation of concerns.
Every subclass of Task
executes an action.
Task
s can be composed in more complex Task
s, or parallelized without effort.
Suclassing Task:
final class GetUserTask: Task<Int, User> {
override func perform(_ input: Int, onSuccess: @escaping (User) -> Void, onError: @escaping (Error) -> Void) {
ApiClient("https://somecoolapi.com/users/\(input)", .get,
onSuccess: { (json: Any) in
onSuccess(User(json: json))
},
onError: { (error: Error) in
onError(error)
}
)
}
}
Using Task:
let getUserTask = GetUserTask()
getUserTask.perform(3,
onSuccess: { (user: User) in
print(user.name)
},
onError: { (error: Error) in
print("An error ocurred.")
}
)
Composing Tasks:
let getUserWithIDTask = GetUserTask()
let getPostsFromUserTask = GetPostsFromUserTask()
let getPostsFromUserID = getUserWithIDTask => getPostsFromUserTask
getPostsFromUserID.perform(3,
onSuccess: { (posts: [Post]) in
print(posts.count)
},
onError: { (error: Error) in
print("An error ocurred.")
}
)
Parallelize Tasks
let getALotOfUserNames = Task.parallel(
[
GetUserName(),
GetUserName(),
GetUserName(),
GetUserName(),
GetUserName(),
GetUserName(),
GetUserName(),
GetUserName(),
GetUserName()
],
reduce: { (userNames: [String]) -> [String] in
return userNames
}
)
getALotOfUserNames.perform(Void(),
onSuccess: { userNames in
print(userNames)
},
onError: { error in
print("An Error!")
}
)
To run the example project, clone the repo, and run pod install
from the Example directory first.
- iOS 8.0 or above.
- Swift 3.0 or above.
FOTask is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "FOTask"
- An explanatory Medium post
- More documentation
- More examples
- More functional features?
fmo91, ortizfernandomartin@gmail.com
FOTask is available under the MIT license. See the LICENSE file for more info.