Swift,RxSwift實現的RxGithub API庫用法和代碼說明

hzql7435 9年前發布 | 11K 次閱讀 API RxSwift Apple Swift開發

來自: 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

所有的請求返回只有三種類型

  1. Requestable<Element:NSObject>

  2. Pageable<Element:_ArrayType where Element.Generator.Element : NSObject>

  3. 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>

 本文由用戶 hzql7435 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!