Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/imex94/NetworkKit
Lightweight Networking and Parsing framework made for iOS, Mac, WatchOS and tvOS.
https://github.com/imex94/NetworkKit
Last synced: 6 days ago
JSON representation
Lightweight Networking and Parsing framework made for iOS, Mac, WatchOS and tvOS.
- Host: GitHub
- URL: https://github.com/imex94/NetworkKit
- Owner: imex94
- License: mit
- Created: 2016-03-10T12:58:01.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2018-02-03T11:17:56.000Z (almost 7 years ago)
- Last Synced: 2024-04-28T15:01:51.369Z (8 months ago)
- Language: Swift
- Homepage:
- Size: 1.35 MB
- Stars: 30
- Watchers: 4
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-ios - NetworkKit - Lightweight Networking and Parsing framework made for iOS, Mac, WatchOS and tvOS. (Networking / Video)
- awesome-ios-star - NetworkKit - Lightweight Networking and Parsing framework made for iOS, Mac, WatchOS and tvOS. (Networking / Video)
README
# NetworkKit ![License MIT](https://go-shields.herokuapp.com/license-MIT-blue.png)
[![Build Status](https://travis-ci.org/imex94/NetworkKit.svg?branch=master)](https://travis-ci.org/imex94/NetworkKit)
[![Available devices](https://camo.githubusercontent.com/30f3ea607a65990e8cf2d6e11a48602167399324/68747470733a2f2f636f636f61706f642d6261646765732e6865726f6b756170702e636f6d2f702f41464e6574776f726b696e672f62616467652e706e67)]()
[![Version](https://img.shields.io/cocoapods/v/NetworkKit.svg?style=flat)](http://cocoapods.org/pods/NetworkKit)
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)A lightweight iOS, Mac and Watch OS framework that makes networking and parsing super simple. Uses the open-sourced [JSONHelper](https://github.com/isair/JSONHelper) with functional parsing. For networking the library supports basic **GET**, **POST**, **DELETE** HTTP requests.
## Install
### Cocoapods
[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
```
$ gem install cocoapods
```To install it, simply add the following line to your ```Podfile```:
```ruby
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!pod 'NetworkKit'
```Then run the folloring command:
```
$ pod install
```### Carthage
[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
You can install Carthage with [Homebrew](http://brew.sh) using the following command:
```
$ brew update
$ brew install carthage
```To integrate NetworkKit into your Xcode project using Carthage, add it into your ```Cartfile```:
```
github "imex94/NetworkKit" ~> 1.3
```Run ```carthage update``` to build the framework and drag the built ```NetworkKit.framework``` into your Xcode project under **Target** - **General** - **Embedded binaries**:
![Import Framework](https://github.com/imex94/NetworkKit/blob/master/images/import2.png "Import Framework")
## Usage
**NetworkKitExample** project provides a guidance to get started.
For the purpose of this example, let say we want to download one of the stories from Hacker News. For this let's use their API endpoint - https://hacker-news.firebaseio.com/v0/item/11245652.json?print=pretty, which give us the following **JSON** response:
[![Run in Postman](https://run.pstmn.io/button.svg)](https://www.getpostman.com/run-collection/aa59a52596f959def779)
```json
{
"by": "jergason",
"id": 11245652,
"kids": [
11245801,
11245962,
11250239,
11246046
],
"time": 1457449896,
"title": "CocoaPods downloads max out five GitHub server CPUs",
"type": "story"
}
```
We want to deserialize the JSON response above to **Swift object**. To do this, we need a **struct** that conforms the protocol **Deserializable** and implement the **required init(data: [String: AnyObject])** constructor and use the deserialization operator (`<--`):```swift
import NetworkKit
``````swift
struct NKItem: Deserializable {
var id: Int?
var username: String?
var kids: [Int]?
var title: String?
var type: String?
var date: NSDate?init(data: [String : AnyObject]) {
id <-- data["id"]
username <-- data["by"]
kids <-- data["kids"]
title <-- data["title"]
type <-- data["type"]
date <-- data["time"]
}
}
```To connect to an API and perform a **GET** request is simple and intuitive and parsing is like **magic**:
```swift
NKHTTPRequest.GET(
"https://hacker-news.firebaseio.com/v0/item/11245652.json",
params: ["print": "pretty"],
success: { data in
var item: NKItem?
item <-- data
},
failure: { error in
print(error.message)
})
```## API
### Networking
#### GET
A simple HTTP GET method to get request from a url.**urlString** - `String`
The string representing the url.**params (Optional)** - `[NSObject: AnyObject]?`
The parameters you need to pass with the GET method. Everything after '?'.**success** - `((AnyObject) -> Void)`
Successful closure in case the request was successful.**failure** - `((NKHTTPRequestError) -> Void)`
Failure Closure which notifies if any error has occurred during the request.#### POST
A simple HTTP POST method to post a resource to the url.**urlString** - `String`
The string representing the url.**params (Optional)** - `[NSObject: AnyObject]?`
The body you need to pass with the POST method. Resources you want to pass.**success** - `((AnyObject) -> Void)`
Successful closure in case the request was successful.**failure** - `((NKHTTPRequestError) -> Void)`
Failure Closure which notifies if any error has occured during the request.#### DELETE
A simple HTTP DELETE method to delete a resource from the server.**urlString** - `String`
The string representing the url.**params (Optional)** - `[NSObject: AnyObject]?`
The body you need to pass with the DELETE method. Resources you want to delete.**success** - `((AnyObject) -> Void)`
Successful closure in case the request was successful.**failure** - `((NKHTTPRequestError) -> Void)`
Failure Closure which notifies if any error has occured during the request.#### Cancel HTTP Requests
There are error and internet availability checking implemented in the framework, but you can simply cancel any task you want if its needed:
```swift
let dataTask = NKHTTPRequest.GET(
"https://hacker-news.firebaseio.com/v0/item/11245652.json",
params: ["print": "pretty"],
success: { data in},
failure: { error in
print(error.message)
})dataTask?.cancel()
```### Parsing
Simple use of parsing can be seen above. There are more advanced options to use
#### Assigning default values
```swift
struct NKItem: Deserializable {
var id = 0
var username = ""init(data: [String : AnyObject]) {
id <-- data["id"]
username <-- data["by"]
}
}
```#### NSURL Deserialization
```swift
let profileImage: NSURL?
profileImage <-- "https://example.com/images/profile_normal.png"
```#### NSDate Deserialization
```swift
let date: NSDate?
date <-- 1414172803 // timestamp to NSDate deserialization
```#### Nested JSON
Let's consider a the truncated version of the Twitter API response:
[![Run in Postman](https://run.pstmn.io/button.svg)](https://www.getpostman.com/run-collection/aa59a52596f959def779)
```json
{
"text":"Aggressive Ponytail #freebandnames",
"retweet_count": 2,
"user":{
"name":"Sean Cummings",
"location":"LA, CA",
"verified":false,
"screen_name":"sean_cummings"
}
}
```Where you can just simply create a User and a Tweet structure with a user instance inside:
```swift
struct NKTwitterUser: Deserializable {
var name = ""
var location = ""
var verified = false
var screenName = ""init(data: [String : AnyObject]) {
name <-- data["name"]
location <-- data["location"]
verified <-- data["verified"]
screenName <-- data["screen_name"]
}
}
``````swift
struct NKTweet: Deserializable {
var text = ""
var retweetCount = 0
var user: NKTwitterUser?init(data: [String : AnyObject]) {
text <-- data["text"]
retweetCount <-- data["retweet_count"]
user <-- data["user"]
}
}
```It's that simple.
## License
NetworkKit is available under the MIT license. See the LICENSE file for more info.
MIT ⓒ Alex Telek