GABoardGameGeek
用于与 BGG 上的游戏和收藏交互的 BoardGameGeek XMLAPI2 Swift 框架
功能
- 只读访问用户收藏和游戏
- 站点搜索
- TODO!论坛、视频、用户、Geeklists 等...
- 全面测试覆盖 & 自动测试报告
要求
- iOS 8.0+, macOS 10.10+, tvOS 9.0+, watchOS 2.0+
- Xcode 9.0+
- Swift 4.0
依赖关系
通信
- 如果想 提问,请使用 Twitter。
- 如果 发现bug,请开启一个issue。
- 如果 有功能请求,请开启一个issue。
- 如果 想贡献,请提交一个pull request。
示例与单元测试
要运行单元测试,并查看一些附加的使用详情,请先从示例目录中克隆repo,然后运行pod install
。
安装
GABoardGameGeek 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中。
pod "GABoardGameGeek"
使用说明
我希望通过这个库实现的一个目标就是使你想要完成的一些常规操作变得非常简单,并且“Swift风格”。为此,这里列出了一些你可以用这个库做的事情。
搜索游戏
你可能想要做的第一件事是按名称搜索游戏。
import GABoardGameGeek
GABoardGameGeek().searchFor("pandemic") { result in
switch(result) {
case .success(let searchResults):
print(searchResults)
case .failure(let error):
print(error)
}
}
或者,你可能只想搜索精确匹配,或者只搜索特定类型的条目,如扩展。
import GABoardGameGeek
GABoardGameGeek().searchFor("pandemic: on the brink", searchType: "boardgameexpansion", exactMatch: true) { result in
switch(result) {
case .success(let searchResults):
print(searchResults)
case .failure(let error):
print(error)
}
}
我有一些关于如何指定搜索类型的计划,因为这些字符串在API中相当常用,但现在,手动指定这些字符串可以得到这个功能。
按游戏ID读取
一旦你有了游戏ID,获取该游戏的详细信息就非常简单
GABoardGameGeek().getGameById(12345) { result in
switch(result) {
case .success(let game):
print(game)
case .failure(let error):
print(error)
}
}
当然,你可能还想一次性请求多个游戏
GABoardGameGeek().getGamesById([1, 232, 41415, 12]) { result in
switch(result) {
case .success(let gameList):
print(gameList)
case .failure(let error):
print(error)
}
}
此外,你可能还想获取游戏统计信息。这些信息也可以为单个游戏或游戏列表请求
GABoardGameGeek().getGameById(12123, stats: true) { result in
switch(result) {
case .success(let game):
print(game)
case .failure(let error):
print(error)
}
}
按用户获取收藏列表
同样,获取用户的收藏也很简单。只需指定他们的用户名。结果将是一个包含 CollectionBoardGame
数组的 ApiResult
GABoardGameGeek().getUserCollection("userName") { result in
switch(result) {
case .success(let gameCollection):
print(gameCollection)
case .failure(let error):
print(error)
}
}
收藏请求还有一些可选的附加参数。你可以请求“简明”的收藏,这通常会更快地返回和解析,尤其是对于拥有大量收藏的用户,但与标准请求相比,它不会包含关于游戏的所有细节。你也可以请求包含统计信息的收藏,这将包含有关游戏的一些额外信息,例如总体评分、在各个排名中的位置以及特定用户对该游戏的评分。你甚至可以将这两个参数结合起来,请求简明游戏详情以及部分游戏统计信息。
最后,BoardGameGeek的API通常会花费一段时间来响应收藏请求,尤其是对于拥有非常大量收藏的用户。因此,请求收藏的调用有一个默认的超时时间为90秒,在此期间它会重试,只要服务器继续响应202
错误码。
GABoardGameGeek().getUserCollection("userName", brief: true, stats: true, timeout: 120) { result in
switch(result) {
case .success(let gameCollection):
print(gameCollection)
case .failure(let error):
print(error)
}
}
处理结果
灵感主要来自于常见的Swift库,如Alamofire,API结果主要返回在一个ApiResult容器中。此容器使用Swift泛型来持有不同类型的数据。
如果你不喜欢Switch语法,你还可以使用一些计算属性来访问结果。以下两个示例是等效的
// Use switch to handle results/errors
GABoardGameGeek().getGameById(12123) { result in
switch(result) {
case .success(let game):
print(game)
case .failure(let error):
print(error)
}
}
// Use accessors to handle results/erros
GABoardGameGeek().getGameById(12123) { result in
if(result.isSuccess) {
print(result.value!)
}
else {
print(result.error!)
}
}
所以请随意选择你喜欢的语法。
错误处理
在处理网络API时,可能会发生多种错误。我已经尽我所能防止可以防止的错误,但在API停止工作或网络连接不可用时,我无法做什么。这时,您可以在ApiResult
枚举的.failure
案例中添加代码,或者检查result.isFailure
。
BggError
枚举中存在几类错误
connectionError
:网络连接本身出了问题,无法访问API。serverNotReady
:在查询用户收藏时出现。服务器尚未准备好,但超时已过期。apiError
:API结果中存在错误,如无效的用户名会导致这种情况。xmlError
:在解析API的XML响应时出现了错误。如果您遇到这样的错误,请联系我或提交有关您正在请求的详细信息以及错误详情的问题。
更新日志
请查看更新日志了解所有更改及其对应的版本。
许可证
GABoardGameGeek遵循MIT许可证发布。有关详细信息,请参阅许可证。