這是一個基于RxSwift的GitHub API庫。希望給那些想寫GitHub APP的同學(xué)一些方便。
RxGitHubAPI的整體設(shè)計
所有的返回都設(shè)計成對象。
例如用戶,YYUser
倉庫,YYRepository
tag,YYTag
等等……
還有很多對象,Issue,PullRequest請大家移步去clone項目看吧
所有的請求返回只有三種類型
1. Requestable
2. Pageable
3. Actionable
這三個全部都是符合Observable協(xié)議的類,也就是說它們是可以被訂閱的。
下面從一個具體例子來解釋下這三個類型的主要設(shè)計用途
1. 怎么樣獲取一個用戶?
2. 獲取到了這個用戶實例,怎么樣獲取他的所有倉庫?
3. 獲取到了所有倉庫,怎么樣給其中的一個倉庫star?
Requestable
這是一個符合Observable協(xié)議的類,它是一個泛型類,且泛類型必須符合NSObject協(xié)議。之所有這樣是因為本庫JSON解析成模型用的是MJExtension。整個工程就這一個庫是OC寫的。也許有時間會換成Swift的解析庫
這個類主要是實現(xiàn) 請求 返回結(jié)果(錯誤或者正確)。當(dāng)你訂閱這個類實例的時候,它就會去網(wǎng)絡(luò)請求,并且返回結(jié)果你訂閱者
具體例子,根據(jù)一個用戶名獲取這個用戶的詳細(xì)信息
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_userstatic func yy_user(username:String)->Requestable{? ? ? ? return Requestable(mothod: .GET, url: kUserURL(username))? ? }? ? ? ?
短短幾行代碼。返回的是Requestable對象,泛型在這里是是YYUser。YYUser就是RxGitHubAPI里表示一個用戶信息的對象模型
Pageable
這是一個符合Observable協(xié)議的類,它是一個泛型類,且泛類型必須符合_ArrayType協(xié)議,且成員必須符合NSObject協(xié)議。因為這是提供給那些返回數(shù)組的API使用的,所有它的泛型必須符合數(shù)組,這樣才能給訂閱者提供想要的類型。這個類主要實現(xiàn) 請求? 返回結(jié)果(錯誤或者正確)? 翻頁當(dāng)你訂閱這個類的時候,他就會去網(wǎng)絡(luò)請求,并且返回結(jié)果給訂閱者。當(dāng)你想翻頁的時候,你可以對Pageable進(jìn)行nextPage操作
具體例子,就拿上面那個例子來說。在上面我們不是獲取到了一個tangqiaoboy用戶的對象模型YYUser嘛。假設(shè)我們現(xiàn)在持有這個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/AVFoundationDemotangqiaoboy/ClassNote-iOStangqiaoboy/DocSets-for-iOStangqiaoboy/DoubanAlbumtangqiaoboy/ELCImageGrabbertangqiaoboy/ELCImagePickerControllertangqiaoboy/FlurryUsageSampletangqiaoboy/FmdbSampletangqiaoboy/HashTesttangqiaoboy/Hello-Worldtangqiaoboy/iOS-Protangqiaoboy/iOS-QR-Code-Generatortangqiaoboy/iOS5ViewCtrlerSampletangqiaoboy/iOSBlogCNtangqiaoboy/iOSSFtangqiaoboy/iphone-apptangqiaoboy/iRubytangqiaoboy/juzhaitangqiaoboy/KVO_Sampletangqiaoboy/LTBlacklisttangqiaoboy/MultiLayerNavigationtangqiaoboy/newsyctangqiaoboy/octopresstangqiaoboy/quotation.github.iotangqiaoboy/Ready2Rocktangqiaoboy/spf13-vimtangqiaoboy/SynchronizedUIActionSheetDemotangqiaoboy/tangqiaoboy.github.comtangqiaoboy/the-swift-programming-language-in-chinesetangqiaoboy/TopWindowSample
是不是超簡單??這里默認(rèn)的是第一頁,每頁三十條,當(dāng)然了,你可以通過下面的方法給改變頁數(shù),或者每頁的條數(shù)。
//獲取到了tangqiao用戶? ? ? ? ? ? ? ? //獲取這個用戶的所有公開倉庫? ? ? ? ? ? ? ? user.yy_repos.page(2, per_page: 1).subscribeNext({ (repos) -> Void in? ? ? ? ? ? ? ? ? ? for repo in repos{? ? ? ? ? ? ? ? ? ? ? ? print(repo.full_name)? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? })? ? ? ? ? ? ? ?
簡單到令人發(fā)指?。。。?/p>
Actionable
這個類其實就是為了處理那些返回Bool的請求。
直接上例子吧。還是接著上面的?,F(xiàn)在我有了tangqiaoboy的倉庫模型YYRepository的實例,我想star。怎么star??
下面對剛剛獲取的倉庫列表的第一個進(jìn)行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("您關(guān)注成功啦!") } }) })
case.Completed:print("completed")
case .Error:print("error") } }
是不是很簡單方便??還有很多工作為完成,后面的開發(fā)估計要等到年后了。大家沒事就手賤star吧!給我點動力哈??!
具體怎么使用,提供哪些功能,歡迎大家去GitHub查看GitHub地址
也歡迎大家去新浪微博?給我發(fā)私信
感謝大家!