- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我目前正在使用 Moya 来发出我的网络请求。我已经从示例项目之一实现了以下内容 @ https://github.com/DroidsOnRoids/RxSwiftExamples#tutorials
下面我设置了 restaurantSearch,这样当有人输入文本时它会发出新请求。
var restaurantSearch: Observable<(String)> {
return searchBar
.rx_text
.throttle(0.5, scheduler: MainScheduler.instance)
.distinctUntilChanged()
}
我有一个返回 [Restaurant] 类型的可观察对象的方法
func restaurants() -> Observable<[Restaurant]> {
return restaurantSearch
.observeOn(MainScheduler.instance)
.flatMapLatest { postcode -> Observable<[Restaurant]?> in
return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
}.replaceNilWith([])
}
internal func getRestaurants(postcode: String, cuisine: String, restaurantName: String) -> Observable<[Restaurant]?> {
return self.justEatProvider
.request(.Restaurant(postcode, cuisine, restaurantName))
.debug()
.mapArrayOptional(Restaurant.self, keyPath: "Restaurants")
}
我正在调用此方法并将其绑定(bind)到 tableView,如下所示:
func setupRx() {
api = JustEatApi(provider: provider, restaurantSearch: restaurantSearch)
api
.restaurants()
.bindTo(tableView.rx_itemsWithCellIdentifier("RestaurantTableViewCell", cellType: RestaurantTableViewCell.self)) { (row, element, cell) in
cell.restaurant = element
}
.addDisposableTo(disposeBag)
}
这工作正常。如果我输入邮政编码,它会进行搜索并填充 tableView。
如果我关闭互联网并尝试更改邮政编码,tableView 将保持原样。但是,当我滚动时,它使我的应用程序崩溃并显示以下内容:
@noreturn func rxFatalError(lastMessage: String) {
// The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.
fatalError(lastMessage)
}
此外,如果我不滚动,而是返回互联网并更改邮政编码,则不会发生任何事情。它似乎失去了它的约束力。
首先,我尝试在 bindTo
方法调用之前添加 catchOnError,但我在评论中看到它不应作为 UIBinding 的一部分处理:http://blog.scottlogic.com/2014/05/11/reactivecocoa-tableview-binding.html
我猜我应该在方法中处理它:
func restaurants() -> Observable<[Restaurant]> {
return restaurantSearch
.observeOn(MainScheduler.instance)
.flatMapLatest { postcode -> Observable<[Restaurant]?> in
return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
}.replaceNilWith([])
}
所以我有两个问题:
1) 我应该在哪里以及如何处理网络错误?
2)为什么我重新上网后tableView没有更新?
非常感谢任何帮助。
最佳答案
我亲自处理发出/解析网络请求的服务中的网络错误。这样做的好方法是将您的网络结果包装在某种枚举中(类似于可选,但如果为零则出错)。所以你会有类似的东西:
enum APIResult<T> {
case Success(T)
case Error(ErrorType)
}
然后你的服务会返回这样的东西
Observable<APIResult<[Restaurant]>>
如果您使用 MVVM 架构,那么您将只在 View 模型中过滤成功的结果,并将该数据提供给 View Controller 。
您还应该看看Driver 单元。它是专门为 UI 绑定(bind)制作的单元,因此它仅在主线程上订阅,从不出错并共享最后的结果。
要将 Observable 转换为 Driver,您可以使用以下三种方法之一:
func asDriver(onErrorJustReturn onErrorJustReturn: Self.E) -> RxCocoa.Driver<Self.E>
func asDriver(onErrorDriveWith onErrorDriveWith: RxCocoa.Driver<Self.E>) -> RxCocoa.Driver<Self.E>
func asDriver(onErrorRecover onErrorRecover: (error: ErrorType) -> RxCocoa.Driver<Self.E>) -> RxCocoa.Driver<Self.E>
这种方法会自动处理您的第二个问题,因为当 Observable 发出错误时,所有订阅者都会取消订阅,即。它终止流。尝试将 .debug() 置于您的 api.restaurants() 调用之后,然后自行查看它是否取消订阅。
您可以阅读有关驱动程序和其他单元的更多信息 here
关于swift - 结合绑定(bind)到 tableView 处理网络错误(Moya、RxSwift、RxCocoa),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925857/
我正在使用 Moya和 Moya-ObjectMapper使用 Rxswift 进行网络请求。 我的网络请求如下。 let provider = RxMoyaProvider() requestHos
这是我的 Giphy.com 客户端的简单版本。我使用 Moya 和 Moya-ObjectMapper 与 Rxswift 来发出网络请求。 这是我的代码: import UIKit import
Moya 请求在返回响应之前需要大约额外 7 秒的时间,而使用 Alamofire 或 URLSession 的任何请求则需要几毫秒...... var method: Moya.Method {
我开始学习了Moya用于网络 在实现 TargetType 时需要它 有没有办法不为每个端点提供样本数据 而且,我找不到启用/禁用样本数据的方法。 var sampleData: Data {
我已经从 UITextField 检索了用户名和密码,现在我想为 Moya 使用基本身份验证执行的每个请求设置用户名和密码。 我该怎么做? 最佳答案 涵盖基本身份验证的文档是 here 这是您需要的必
所以我一直在通过 Gary Tokman 编写本教程构建一个餐厅查看应用程序,它很棒。从头到尾,一切都运行良好。 目的是更改或添加参数并包括“术语”或“类别”。现在,这会将搜索更改为特定业务,而不仅仅
好吧,让我们先解释一下我的目标。我正在尝试构建一个结构来从 Moya 获取项目并使用 Realm 对象正确映射我的项目,以便将来保存它们。所有这些都应该使用 rxswift 完成,以获得关联的 rea
我尝试通过 Moya 启动网络请求。 let provider = MoyaProvider() provider.rx.request(.Auth(username: usernam
如何使用 (Rx) Moya 将默认请求参数(例如 AppID)附加到每个 API 调用? 最佳答案 Moya 中的 Endpoint 类有 adding(newHTTPHeaderFields:)
我们正在使用 Alamofire与 Moya和 Moya-ObjectMapper , 来处理 API 调用。服务器响应如下: { "userid" : "1", "token" : "abc" }
我正在用 Swift 编写一个 iOS 应用 并使用 Moya 作为网络层。 我正在制作一个要在正文中发送的请求对象,并使用 Moya 执行 API 调用: struct OrderRequest{
我正在使用 django rest framework for apis 开发一个 iOS 应用程序。但目前我无法在使用身份验证凭据调用 api 时取得成功。 我通过将 Header 设置为 Auth
我可以使用 func process(_ result: Result, target: TargetType) -> Result 修改 Moya 响应中的数据吗? Moya插件的方法?我需要将数据
我正在使用 RxMoya 进行网络调用并扩展 PremitiveSequence 和 Response 以处理返回的错误。我声明了一个网络错误结构,我可以使用它来获取所有错误详细信息,因此通过 Bas
我在我的 swift 应用程序中使用 Moya 进行网络请求。 我能够使用 Moya- Object Mapper 获取请求并映射结果。 我之前用过alamofire,熟悉发帖、获取请求、读取响应头的
我正在尝试集成 Moya,它被认为是设计网络层的一个很好的框架。我被困在如何重试网络请求上。当我们收到错误时,是否可以从 Moya 提供程序获取请求变量?请注意,我正在寻找 swift 而非 Rxsw
我正在使用 Moya + Alamofire 并且我正在尝试验证每个请求(例如 Alamofire.request(.GET, "https://httpbin.org/get").validate(
我想知道如何在后台线程中发出请求,我的意思是在后台线程中获取然后返回到主线程 目前我可以在请求后通过调用进入主线程: .observe(on: UIScheduler()) 但是我在另一个线程中请求没
我在使用以下代码创建自己的 Moya 插件时遇到问题: import Foundation import Moya import Result public final class CustomPlu
我继承了一个使用 Moya 的 RxSwift 项目。我有一项任务是将请求从一个后端移动到另一个后端。两个后端都有它们的 TargetType 设置得很好,因为它们在其他地方被广泛使用。 原始请求如下
我是一名优秀的程序员,十分优秀!