這是一個(gè)基于RxSwift的GitHub API庫(kù)。希望給那些想寫GitHub APP的同學(xué)一些方便握巢。
RxGitHubAPI的整體設(shè)計(jì)
所有的返回都設(shè)計(jì)成對(duì)象晕鹊。
例如用戶,YYUser
倉(cāng)庫(kù),YYRepository
tag,YYTag
等等……
還有很多對(duì)象溅话,Issue晓锻,PullRequest請(qǐng)大家移步去clone項(xiàng)目看吧
所有的請(qǐng)求返回只有三種類型
1. Requestable
2. Pageable
3. Actionable
這三個(gè)全部都是符合Observable協(xié)議的類,也就是說它們是可以被訂閱的飞几。
下面從一個(gè)具體例子來解釋下這三個(gè)類型的主要設(shè)計(jì)用途
1. 怎么樣獲取一個(gè)用戶砚哆?
2. 獲取到了這個(gè)用戶實(shí)例,怎么樣獲取他的所有倉(cāng)庫(kù)屑墨?
3. 獲取到了所有倉(cāng)庫(kù)躁锁,怎么樣給其中的一個(gè)倉(cāng)庫(kù)star?
Requestable
這是一個(gè)符合Observable協(xié)議的類绪钥,它是一個(gè)泛型類灿里,且泛類型必須符合NSObject協(xié)議。之所有這樣是因?yàn)楸編?kù)JSON解析成模型用的是MJExtension程腹。整個(gè)工程就這一個(gè)庫(kù)是OC寫的匣吊。也許有時(shí)間會(huì)換成Swift的解析庫(kù)
這個(gè)類主要是實(shí)現(xiàn) 請(qǐng)求 返回結(jié)果(錯(cuò)誤或者正確)。當(dāng)你訂閱這個(gè)類實(shí)例的時(shí)候寸潦,它就會(huì)去網(wǎng)絡(luò)請(qǐng)求色鸳,并且返回結(jié)果你訂閱者
具體例子,根據(jù)一個(gè)用戶名獲取這個(gè)用戶的詳細(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")? ? ? ? ? ? }? ? ? ? }? ?
//下面是控制臺(tái)輸出? ?
tangqiaoboy
completed
完美见转!
看看這個(gè)
RxGitHubAPI.yy_userstatic func yy_user(username:String)->Requestable{? ? ? ? return Requestable(mothod: .GET, url: kUserURL(username))? ? }? ? ? ?
短短幾行代碼命雀。返回的是Requestable對(duì)象,泛型在這里是是YYUser斩箫。YYUser就是RxGitHubAPI里表示一個(gè)用戶信息的對(duì)象模型
Pageable
這是一個(gè)符合Observable協(xié)議的類吏砂,它是一個(gè)泛型類,且泛類型必須符合_ArrayType協(xié)議乘客,且成員必須符合NSObject協(xié)議狐血。因?yàn)檫@是提供給那些返回?cái)?shù)組的API使用的,所有它的泛型必須符合數(shù)組易核,這樣才能給訂閱者提供想要的類型匈织。這個(gè)類主要實(shí)現(xiàn) 請(qǐng)求? 返回結(jié)果(錯(cuò)誤或者正確)? 翻頁(yè)當(dāng)你訂閱這個(gè)類的時(shí)候,他就會(huì)去網(wǎng)絡(luò)請(qǐng)求牡直,并且返回結(jié)果給訂閱者缀匕。當(dāng)你想翻頁(yè)的時(shí)候,你可以對(duì)Pageable進(jìn)行nextPage操作
具體例子碰逸,就拿上面那個(gè)例子來說乡小。在上面我們不是獲取到了一個(gè)tangqiaoboy用戶的對(duì)象模型YYUser嘛。假設(shè)我們現(xiàn)在持有這個(gè)YYUser的實(shí)例饵史,就叫tangQiaoUser.我們來看看怎么獲取這個(gè)tangqiaoUser的所有public倉(cāng)庫(kù)满钟。
RxGitHubAPI.yy_user("tangqiaoboy").subscribe { (user) -> Void in? ? ? ? ? ? switch user{? ? ? ? ? ? case .Next(let user): print(user.login)? ? ? ? ? ? ? ?
//獲取到了tangqiao用戶? ? ? ? ? ? ? ? //獲取這個(gè)用戶的所有公開倉(cāng)庫(kù)? ? ? ? ? ? ? ? user.yy_repos.subscribeNext({ (repos) -> Void in? ? ? ? ? ? ? ? ? ?
for repo in repos{? print(repo.full_name)} })? ? ? ? ? ?
case.Completed:print("completed")? ? ? ? ? ?
case .Error:print("error") }? ? ? ? }? ? ? ? ? ?
//控制臺(tái)輸出如下? ? 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
是不是超簡(jiǎn)單掸哑??這里默認(rèn)的是第一頁(yè)零远,每頁(yè)三十條,當(dāng)然了厌蔽,你可以通過下面的方法給改變頁(yè)數(shù)牵辣,或者每頁(yè)的條數(shù)。
//獲取到了tangqiao用戶? ? ? ? ? ? ? ? //獲取這個(gè)用戶的所有公開倉(cāng)庫(kù)? ? ? ? ? ? ? ? user.yy_repos.page(2, per_page: 1).subscribeNext({ (repos) -> Void in? ? ? ? ? ? ? ? ? ? for repo in repos{? ? ? ? ? ? ? ? ? ? ? ? print(repo.full_name)? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? })? ? ? ? ? ? ? ?
簡(jiǎn)單到令人發(fā)指EN诚颉!戴卜!
Actionable
這個(gè)類其實(shí)就是為了處理那些返回Bool的請(qǐng)求逾条。
直接上例子吧。還是接著上面的⊥栋現(xiàn)在我有了tangqiaoboy的倉(cāng)庫(kù)模型YYRepository的實(shí)例师脂,我想star。怎么star江锨?吃警?
下面對(duì)剛剛獲取的倉(cāng)庫(kù)列表的第一個(gè)進(jìn)行star!簡(jiǎn)單:
RxGitHubAPI.yy_user("tangqiaoboy").subscribe { (user) -> Void in
switch user{
case .Next(let user):print(user.login)
//獲取到了tangqiao用戶
//獲取這個(gè)用戶的所有公開倉(cāng)庫(kù)
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") } }
是不是很簡(jiǎn)單方便酌心??還有很多工作為完成挑豌,后面的開發(fā)估計(jì)要等到年后了安券。大家沒事就手賤star吧!給我點(diǎn)動(dòng)力哈Cビⅰ侯勉!
具體怎么使用,提供哪些功能债蓝,歡迎大家去GitHub查看GitHub地址
也歡迎大家去新浪微博?給我發(fā)私信
感謝大家壳鹤!