gpt4 book ai didi

objective-c - 你会如何编写以 "Reactive Cocoa"方式获取集合?

转载 作者:太空狗 更新时间:2023-10-30 03:25:56 24 4
gpt4 key购买 nike

我正在构建的客户端正在使用 Reactive CocoaOctokit到目前为止,一切进展顺利。但是,现在我正处于想要获取存储库集合的地步,但在以“RAC 方式”执行此操作时遇到了麻烦

// fire this when an authenticated client is set
[[RACAbleWithStart([GHDataStore sharedStore], client)
filter:^BOOL (OCTClient *client) {
return client != nil && client.authenticated;
}]
subscribeNext:^(OCTClient *client) {
[[[client fetchUserRepositories] deliverOn:RACScheduler.mainThreadScheduler]
subscribeNext:^(OCTRepository *fetchedRepo) {
NSLog(@" Received new repo: %@",fetchedRepo.name);
}
error:^(NSError *error) {
NSLog(@"Error fetching repos: %@",error.localizedDescription);
}];
} completed:^{
NSLog(@"Completed fetching repos");
}];

我最初假设 -subscribeNext: 会传递一个 NSArray,但现在我明白它会在每个“下一个”对象返回时发送消息,在本例中是一个OCTRepository.

现在我可以做这样的事情:

NSMutableArray *repos = [NSMutableArray array];
// most of that code above
subscribeNext:^(OCTRepository *fetchedRepo) {
[repos addObject:fetchedRepo];
}
// the rest of the code above

当然,这可行,但它似乎不遵循 RAC 支持的功能原则。我真的很想坚持这里的惯例。非常感谢任何关于 RAC/Octokit 功能的信息!

最佳答案

这在很大程度上取决于您之后要对存储库执行的操作。似乎您想在拥有所有存储库后做某事,所以我将设置一个示例来执行此操作。

// Watch for the client to change
RAC(self.repositories) = [[[[[RACAbleWithStart([GHDataStore sharedStore], client)
// Ignore clients that aren't authenticated
filter:^ BOOL (OCTClient *client) {
return client != nil && client.authenticated;
}]
// For each client, execute the block. Returns a signal that sends a signal
// to fetch the user repositories whenever a new client comes in. A signal of
// of signals is often used to do some work in response to some other work.
// Often times, you'd want to use `-flattenMap:`, but we're using `-map:` with
// `-switchToLatest` so the resultant signal will only send repositories for
// the most recent client.
map:^(OCTClient *client) {
// -collect will send a single value--an NSArray with all of the values
// that were send on the original signal.
return [[client fetchUserRepositories] collect];
}]
// Switch to the latest signal that was returned from the map block.
switchToLatest]
// Execute a block when an error occurs, but don't alter the values sent on
// the original signal.
doError:^(NSError *error) {
NSLog(@"Error fetching repos: %@",error.localizedDescription);
}]
deliverOn:RACScheduler.mainThreadScheduler];

现在,每当从客户端更新存储库时,self.repositories 都会更改(并触发 KVO 通知)。

有几点需要注意:

  1. 最好尽可能避免 subscribeNext:。使用它超出了功能范例(doNext:doError: 也是如此,但它们有时也是有用的工具)。一般来说,您需要考虑如何将信号转换成您想要的东西。

  2. 如果您想将一个或多个工作链接在一起,您通常需要使用 flattenMap:。更一般地说,您要开始考虑信号中的信号——发送代表其他工作的其他信号的信号。

  3. 您通常希望等待尽可能长的时间才能将工作移回主线程。

  4. 在思考一个问题时,有时从写下每个单独的信号开始思考 a) 你拥有什么,b) 你想要什么,以及 c) 如何从一个信号到另一个信号是很有值(value)的。

编辑:更新以解决下面@JustinSpahrSummers 的评论。

关于objective-c - 你会如何编写以 "Reactive Cocoa"方式获取集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17281424/

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