开发者社区> 问答> 正文

Combine@Published属性:在更新期间从其他地方获取当前值

我的主要问题是,我试图解决(无证)的事实@Published属性在通知订阅方更改后才会更新该属性的值。我似乎找不到一个很好的方法来绕过它。

考虑以下人为组合Subject和@Published财产。首先,一个简单的类:

class StringPager {
    @Published var page = 1
    @Published var string = ""
}
let pager = StringPager()

然后是一个简单的通过主题:

let stringSubject = PassthroughSubject<String, Never>()

为了进行调试,让我们订阅String属性并打印出来:

pager.$string.sink { print($0) } 到目前一切尚好。接下来,让我们订阅主题并根据其值更改寻呼机:

stringSubject.sink { string in
  if pager.page == 1 {
    pager.string = string
  } else {
    pager.string = string.uppercased()
  }
}

希望,这个逻辑将允许我们使寻呼机字符串当我们不在第一页时就会出现。

现在,当页面更新时,让我们通过string Subject发送值:

pager.$page.sink { 
  $0 == 1 ? stringSubject.send("lowercase") : stringSubject.send("uppercase") 
}

如果我们已经正确地理解了这个逻辑,那么小写将总是被小写,而大写则总是被超感知。不幸的是,事情根本不是这样的。下面是一个示例输出:

pager.page = 1 // lowercase
pager.page = 2 // uppercase
pager.page = 3 // UPPERCASE
pager.page = 4 // UPPERCASE
pager.page = 1 // LOWERCASE
pager.page = 1 // lowercase

原因是当我们订阅主题时,我们检查pager.page...但更新pager.page是什么触发了主体的关闭,所以pager.page还没有更新的值,因此主题执行错误的分支。

我两个人都试过了zip使.pager.$page在下沉之前:

stringSubject.zip(pager.$page).eraseToAnyPublisher().sink { ...same code... }

以及combineLatest指的是:

stringSubject.combineLatest(pager.$page).eraseToAnyPublisher().sink { ...same code... }

但这会导致完全相同的观察行为(在前一种情况下)或同样不理想的行为,除了更多的行为(在后一种情况下)。

我怎么才能拿到电流页内主题sink结束?

展开
收起
游客5akardh5cojhg 2019-12-09 13:45:30 511 0
0 条回答
写回答
取消 提交回答
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用计算和数据去改变整个世界 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多