Objective c 如果在反应信号链中未找到主要选择,则提供第二选择

Objective c 如果在反应信号链中未找到主要选择,则提供第二选择,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我有以下代码,它运行于一系列图像记录中,尝试查找标记为“primary”的记录,加载该记录,并将其分配给UIImageView: // When there's a new image, fetch it, and set the headerView (which by default is an UIImageView) RAC( self, imageView.image ) = // Return a sequence for photos [[[[[[self

我有以下代码,它运行于一系列图像记录中,尝试查找标记为“primary”的记录,加载该记录,并将其分配给
UIImageView

    // When there's a new image, fetch it, and set the headerView (which by default is an UIImageView)
RAC( self, imageView.image ) =

    // Return a sequence for photos
    [[[[[[self modelImagesSignal] ignore:nil] flattenMap:^RACStream *(NSDictionary *photos)
        {
        NSLog(@"Got photos: %@" , photos) ;
        return photos.rac_sequence.signal ;
        }]

    // Consider each photo
    filter:^BOOL(NSDictionary *photoDescriptor)
        {
        NSLog(@"Descriptor: %@" , photoDescriptor) ;
        return ((NSNumber *)photoDescriptor[@"primary"]).boolValue ;
        }]

    // Load the selected photo
    flattenMap:^RACStream *(NSDictionary *selectedPhotoDescriptor)
        {
        NSLog(@"selected photo desc: %@" , selectedPhotoDescriptor) ;
        return [AsyncImageFetcher imageAtURL:[NSURL URLWithString:selectedPhotoDescriptor[@"url"]] cache:YES] ; // This will -deliverOn: the main thread
        }]

    // Catch errors
    catch:^RACSignal *(NSError *error)
        {
        FLASH_REPORT_T(error.description, nil, xkFlashMessageTypeError) ;
        return [RACSignal empty] ;
        }] ;
  • 如果没有主记录,我想返回第一条记录 遇到的问题,无论是否为主要问题,以及
  • 如果没有遇到任何记录,我想 返回默认图像
  • 我该怎么做

  • 如果没有主记录,我想返回遇到的第一条记录,不管它是否是主记录,以及
  • 如果没有遇到任何记录,我想返回一个默认图像
  • 这不是使用您的原始代码,而是提取您所要求的基本内容,下面是一种合成信号以获得所需内容的方法:

    MyImageModel *myDefaultImageModel = [self createDefaultImageModel];
    
    RACSignal *images = [self fetchImagesOrWhatever];
    RACSignal *primaryImages = [images filter:^(MyImageModel *im) { return im.isPrimary; }];
    RACSignal *defaultImage = [RACSignal return:myDefaultImageModel];
    
    // This is the line to pay attention to:
    RACSignal *finalImage = [[[primaryImages concat:[images concat:defaultImage]]] take:1];
    
    RAC(self, imageView.image) = [finalImage map:^(MyImageModel *im) {
        // Convert MyImageModel to a UIImage here, and return it.
    }];
    
    此代码构造一个名为
    finalImage
    的信号,该信号由以下值按顺序组成:

  • 每个标记为“主”的图像
  • 第一个图像(来自馈送#1的图像的相同信号)
  • 默认图像
  • 然后使用
    -[RACSignal take:1]
    获取其中的第一个。如果#1或#2可能是空信号(因为没有原色或根本没有图像),你知道你至少会得到#3

  • 如果没有主记录,我想返回遇到的第一条记录,不管它是否是主记录,以及
  • 如果没有遇到任何记录,我想返回一个默认图像
  • 这不是使用您的原始代码,而是提取您所要求的基本内容,下面是一种合成信号以获得所需内容的方法:

    MyImageModel *myDefaultImageModel = [self createDefaultImageModel];
    
    RACSignal *images = [self fetchImagesOrWhatever];
    RACSignal *primaryImages = [images filter:^(MyImageModel *im) { return im.isPrimary; }];
    RACSignal *defaultImage = [RACSignal return:myDefaultImageModel];
    
    // This is the line to pay attention to:
    RACSignal *finalImage = [[[primaryImages concat:[images concat:defaultImage]]] take:1];
    
    RAC(self, imageView.image) = [finalImage map:^(MyImageModel *im) {
        // Convert MyImageModel to a UIImage here, and return it.
    }];
    
    此代码构造一个名为
    finalImage
    的信号,该信号由以下值按顺序组成:

  • 每个标记为“主”的图像
  • 第一个图像(来自馈送#1的图像的相同信号)
  • 默认图像
  • 然后使用
    -[RACSignal take:1]
    获取其中的第一个。如果#1或#2可能是空信号(因为没有原色或根本没有图像),你知道你至少会得到#3

  • 如果没有主记录,我想返回遇到的第一条记录,不管它是否是主记录,以及
  • 如果没有遇到任何记录,我想返回一个默认图像
  • 这不是使用您的原始代码,而是提取您所要求的基本内容,下面是一种合成信号以获得所需内容的方法:

    MyImageModel *myDefaultImageModel = [self createDefaultImageModel];
    
    RACSignal *images = [self fetchImagesOrWhatever];
    RACSignal *primaryImages = [images filter:^(MyImageModel *im) { return im.isPrimary; }];
    RACSignal *defaultImage = [RACSignal return:myDefaultImageModel];
    
    // This is the line to pay attention to:
    RACSignal *finalImage = [[[primaryImages concat:[images concat:defaultImage]]] take:1];
    
    RAC(self, imageView.image) = [finalImage map:^(MyImageModel *im) {
        // Convert MyImageModel to a UIImage here, and return it.
    }];
    
    此代码构造一个名为
    finalImage
    的信号,该信号由以下值按顺序组成:

  • 每个标记为“主”的图像
  • 第一个图像(来自馈送#1的图像的相同信号)
  • 默认图像
  • 然后使用
    -[RACSignal take:1]
    获取其中的第一个。如果#1或#2可能是空信号(因为没有原色或根本没有图像),你知道你至少会得到#3

  • 如果没有主记录,我想返回遇到的第一条记录,不管它是否是主记录,以及
  • 如果没有遇到任何记录,我想返回一个默认图像
  • 这不是使用您的原始代码,而是提取您所要求的基本内容,下面是一种合成信号以获得所需内容的方法:

    MyImageModel *myDefaultImageModel = [self createDefaultImageModel];
    
    RACSignal *images = [self fetchImagesOrWhatever];
    RACSignal *primaryImages = [images filter:^(MyImageModel *im) { return im.isPrimary; }];
    RACSignal *defaultImage = [RACSignal return:myDefaultImageModel];
    
    // This is the line to pay attention to:
    RACSignal *finalImage = [[[primaryImages concat:[images concat:defaultImage]]] take:1];
    
    RAC(self, imageView.image) = [finalImage map:^(MyImageModel *im) {
        // Convert MyImageModel to a UIImage here, and return it.
    }];
    
    此代码构造一个名为
    finalImage
    的信号,该信号由以下值按顺序组成:

  • 每个标记为“主”的图像
  • 第一个图像(来自馈送#1的图像的相同信号)
  • 默认图像

  • 然后使用
    -[RACSignal take:1]
    获取其中的第一个。如果#1或#2可能是空信号(因为没有原色或根本没有图像),那么您知道您至少会得到#3。

    谢谢,这基本上是有效的。不过我注意到,只有将我的
    图像
    集中到
    默认图像
    时,它才起作用。将
    defaultImage
    压缩到
    images
    无法工作。不太清楚原因。根据您最初的要求,连接顺序应该是
    primaryImages++images++defaultImage
    。然后,当您对结果信号
    -take:1
    时,您将获得第一个主映像,如果失败,您将获得第一个映像,如果失败,您将获得默认映像。这种连接是关联的(在数学意义上)。如果您以其他顺序连接它们,我想知道您的代码是否还有其他问题。谢谢您的回答。我对这种方法有意见。当我使用take:1时,即使#1返回值,#2也会被订阅(尽管值被忽略)。例如,如果#2执行网络操作,它将启动它,即使#1返回一个值。你知道,如何预防吗?我的意思是,如果#1返回,阻止#2执行其工作?小证据:这听起来像是ReactiveCocoa中的一个bug。谢谢,这基本上起作用了。不过我注意到,只有将我的
    图像
    集中到
    默认图像
    时,它才起作用。将
    defaultImage
    压缩到
    images
    无法工作。不太清楚原因。根据您最初的要求,连接顺序应该是
    primaryImages++images++defaultImage
    。然后,当您对结果信号
    -take:1
    时,您将获得第一个主映像,如果失败,您将获得第一个映像,如果失败,您将获得默认映像。这种连接是关联的(在数学意义上)。如果您以其他顺序连接它们,我想知道您的代码是否还有其他问题。谢谢您的回答。我对这种方法有意见。当我使用take:1时,即使#1返回值,#2也会被订阅(尽管值被忽略)。例如,如果#2执行网络操作,它