【问题标题】:Cannot get data in handler for when(resolved:)无法在处理程序中获取数据何时(已解决:)
【发布时间】:2018-06-28 12:20:29
【问题描述】:

PromiseKit 6

我有一个从数据库获取警报列表的函数,然后我需要使用每个数据库的 contentId 属性来获取内容并附加到适当的警报项。

也许有更好的方法,但现在,我想出的是将 Promise 收集到一个列表中,然后调用 when(resolved:)。我之所以选择它,是因为如果任何承诺失败,我希望能够返回所有可以通过的。

在函数 attachContents 中的 then 处理程序中,处理程序传递了这种类型 [Result],但是当我映射列表时我可以访问的唯一字段是 isFulfilled 我检查了 Result 是什么类型,发现了这个:

public enum Result<T> {
    case fulfilled(T)
    case rejected(Error)
}

public extension PromiseKit.Result {
    var isFulfilled: Bool {
        switch self {
        case .fulfilled:
            return true
        case .rejected:
            return false
        }
    }
}

它引导我找到第一个,在 Resolver.swift 中,所以我不确定为什么我无法通过调用已完成来获取数据

private func getContent(for alert: Model) -> Promise<ViewModel> {
  return firstly { () -> Promise<Any> in

    if let contentType = AlertContentType(rawValue: alert.type) {
      switch contentType {
      case .news:
        return newsService.get(contentId: contentId, superareaId: superareaId).compactMap { $0 as Any }

      case .insight:
        return insightService.get(contentId: contentId, superareaId: superareaId).compactMap { $0 as Any }
      }
    } else { throw DataError.Missing(error: "Could not retrieve type!") }
  }.compactMap { content in
    var viewModel = alert.toViewModel()
    viewModel.content = content

    return viewModel
  }
}

private func attachContents(to alerts: [Model]) -> Promise<[ViewModel]> {
  return firstly { () -> Guarantee<[Result<ViewModel>]> in
    let contentPromises: [Promise<AlertViewModel>] = alerts.map {
      return self.getContent(for: $0)
    }
    return when(resolved: contentPromises)
  }.then { (vModels: [Result<ViewModel>]) -> Promise<[OIAlertViewModel]> in
    vModels.map { (vm: Result<OIAlertViewModel>) in
      // vm.isFulfilled is the only accessible property here
      // can't call 
    }
  }
}

【问题讨论】:

    标签: ios swift promisekit


    【解决方案1】:

    Result.fulfilled.rejected 的枚举

    vModels.map { (vm: Result<OIAlertViewModel>) in
        switch vm {
            case .fulfilled(let alert):
                print(alert)
            case .rejected(let error):
                print(error)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 2022-10-06
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2022-11-23
      相关资源
      最近更新 更多