gpt4 book ai didi

ios - 使用 ReactiveCocoa 从对象数组链接异步操作

转载 作者:技术小花猫 更新时间:2023-10-29 11:18:52 26 4
gpt4 key购买 nike

我有一个实体数组,我想对这些实体执行异步操作。这些操作应该与数组中的实体以相同的顺序链接和运行。我是 RAC 的新手。如何在 RAC 中做到这一点?

最佳答案

首先,您需要一个包装器方法来执行您的异步操作,这将返回一个信号。让我们假设异步操作操作需要一个完成 block 。从它的声音来看,你不关心值,你想要副作用,在这种情况下信号不发送值,它只完成。

- (RACSignal *)asyncOperation {
return [RACSignal createSignal:^RACDisposable * (id<RACSubscriber> subscriber) {
[self asyncOperationWithCompletion:^{
[subscriber sendCompleted];
}];
return nil; // `nil` means there's no way to cancel.
}];
}

编辑:感谢 Justin Spahr-Summers 的评论,这里有一个更简单的链接操作的方法:

RACSignal *signal = [RACSignal concat:[array.rac_sequence map:^(id entity) {
return [entity asyncOperation];
}]];

ReactiveCocoa 的+concat: 运算符获取一组信号并一次订阅一个信号,等待一个信号完成后再订阅其后续信号。这里使用-rac_sequence是为了将实体映射到操作信号。

在这种情况下,+concat: 的使用实现了与 -then: 相同的效果,链接来 self 下面的初始答案。


使用 RAC 包装器,一个解决方案是从一个空信号开始,并通过遍历实体并使用 -then: 组装操作来构建链。 . -then: 操作本质上是等待前一个操作完成,然后再开始下一个操作。

RACSignal *signal = [RACSignal empty];
for (id entity in array) {
signal = [signal then:^{
return [entity asyncOperation];
}];
}

[signal subscribeCompleted:^{
// At this point, all operations have completed
}];

此时你拥有的是:

[[[[RACSignal empty]
then:^{ return [entity1 asyncOperation]; }]
then:^{ return [entity2 asyncOperation]; }]
// ...
then:^{ return [entityN asyncOperation]; }]

ReactiveCocoa 有帮助 documentation以及非常有据可查的标题,当我是新手时,这两者对我来说都非常有值(value)。

关于ios - 使用 ReactiveCocoa 从对象数组链接异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com