Swift,RxSwift實現的RxGithub API庫用法和代碼說明
來自: http://fengdeng.github.io/blog/2016/01/31/rxgithub-apiku-yong-fa-he-dai-ma-shuo-ming/
這是一個基于RxSwift的GitHub API庫。希望給那些想寫GitHub APP的同學一些方便。
RxGitHubAPI的整體設計
所有的返回都設計成對象。 例如用戶,YYUser 倉庫,YYRepository tag,YYTag 等等……
請大家移步去clone項目看吧 https://github.com/FengDeng/RxGitHubAPI
所有的請求返回只有三種類型
-
Requestable<Element:NSObject>
-
Pageable<Element:_ArrayType where Element.Generator.Element : NSObject>
-
Actionable<Element:BooleanLiteralConvertible>
這三個全部都是符合Observable協議的類,也就是說它們是可以被訂閱的。
下面來解釋下這三個類型的主要設計用途 1. 怎么樣獲取一個用戶? 2. 獲取到了這個用戶實例,怎么樣獲取他的所有倉庫? 3. 獲取到了所有倉庫,怎么樣給其中的一個倉庫star?
Requestable<Element:NSObject>
這是一個符合Observable協議的類,它是一個泛型類,且泛類型必須符合NSObject協議。之所有這樣是因為本庫JSON解析成模型用的是MJExtension。整個工程就這一個庫是OC寫的。也許有時間會換成Swift的解析庫、
這個類主要是實現 請求 返回結果(錯誤或者正確)。 當你訂閱這個類實例的時候,它就會去網絡請求,并且返回結果你訂閱者
具體例子,根據一個用戶名獲取這個用戶的詳細信息
RxGitHubAPI.yy_user("tangqiaoboy").subscribe { (user) -> Void in
switch user{
case .Next(let user):
print(user.login)
case.Completed:
print("completed")
case .Error:
print("error")
}
}
//下面是控制臺輸出
tangqiaoboy
completed
完美!看看這個RxGitHubAPI.yy_user
static func yy_user(username:String)->Requestable<YYUser>{
return Requestable(mothod: .GET, url: kUserURL(username))
}
短短幾行代碼。返回的是Requestable對象,泛型在這里是是YYUser。
YYUser就是RxGitHubAPI里表示一個用戶信息的對象模型
Pageable<Element: _ArrayType where Element.Generator.Element : NSObject>
這是一個符合Observable協議的類,它是一個泛型類,且泛類型必須符合_ArrayType協議,且成員必須符合NSObject協議。因為這是提供給那些返回數組的API使用的,所有它的泛型必須符合數組,這樣才能給訂閱者提供想要的類型。
這個類主要實現 請求 返回結果(錯誤或者正確) 翻頁 當你訂閱這個類的時候,他就會去網絡請求,并且返回結果給訂閱者。當你想翻頁的時候,你可以對Pageable進行nextPage操作
具體例子,就拿上面那個例子來說。在上面我們不是獲取到了一個tangqiaoboy用戶的對象模型YYUser嘛。假設我們現在持有這個YYUser的實例,就叫tangQiaoUser.我們來看看怎么獲取這個tangqiaoUser的所有public倉庫。
RxGitHubAPI.yy_user("tangqiaoboy").subscribe { (user) -> Void in
switch user{
case .Next(let user):
print(user.login)
//獲取到了tangqiao用戶
//獲取這個用戶的所有公開倉庫
user.yy_repos.subscribeNext({ (repos) -> Void in
for repo in repos{
print(repo.full_name)
}
})
case.Completed:
print("completed")
case .Error:
print("error")
}
}
//控制臺輸出如下
tangqiaoboy/AVFoundationDemo
tangqiaoboy/ClassNote-iOS
tangqiaoboy/DocSets-for-iOS
tangqiaoboy/DoubanAlbum
tangqiaoboy/ELCImageGrabber
tangqiaoboy/ELCImagePickerController
tangqiaoboy/FlurryUsageSample
tangqiaoboy/FmdbSample
tangqiaoboy/HashTest
tangqiaoboy/Hello-World
tangqiaoboy/iOS-Pro
tangqiaoboy/iOS-QR-Code-Generator
tangqiaoboy/iOS5ViewCtrlerSample
tangqiaoboy/iOSBlogCN
tangqiaoboy/iOSSF
tangqiaoboy/iphone-app
tangqiaoboy/iRuby
tangqiaoboy/juzhai
tangqiaoboy/KVO_Sample
tangqiaoboy/LTBlacklist
tangqiaoboy/MultiLayerNavigation
tangqiaoboy/newsyc
tangqiaoboy/octopress
tangqiaoboy/quotation.github.io
tangqiaoboy/Ready2Rock
tangqiaoboy/spf13-vim
tangqiaoboy/SynchronizedUIActionSheetDemo
tangqiaoboy/tangqiaoboy.github.com
tangqiaoboy/the-swift-programming-language-in-chinese
tangqiaoboy/TopWindowSample</pre>
是不是超簡單??
這里默認的是第一頁,每頁三十條,當然了,你可以通過下面的方法給改變頁數,或者每頁的條數。
//獲取到了tangqiao用戶
//獲取這個用戶的所有公開倉庫
user.yy_repos.page(2, per_page: 1).subscribeNext({ (repos) -> Void in
for repo in repos{
print(repo.full_name)
}
})
簡單到令人發指!!!!
Actionable<Element:BooleanLiteralConvertible>
這個類其實就是為了處理那些返回Bool的請求。
直接上例子吧。還是接著上面的。現在我有了tangqiaoboy的倉庫模型YYRepository的實例,我想star。怎么star??
下面對剛剛獲取的倉庫列表的第一個進行star!簡單:
RxGitHubAPI.yy_user("tangqiaoboy").subscribe { (user) -> Void in
switch user{
case .Next(let user):
print(user.login)
//獲取到了tangqiao用戶
//獲取這個用戶的所有公開倉庫
user.yy_repos.page(2, per_page: 1).subscribeNext({ (repos) -> Void in
repos[0].action_star.subscribeNext({ (isSuccess) -> Void in
if isSuccess{
print("您關注成功啦!")
}
})
})
case.Completed:
print("completed")
case .Error:
print("error")
}
}
是不是很簡單方便??還有很多工作為完成,后面的開發估計要等到年后了。大家沒事就手賤star吧!給我點動力哈!!
歡迎大家去GitHub查看 源代碼
也歡迎大家去新浪微博去給我發私信
感謝大家!
</div>