2016-02-22 2 views
0

я играю с кодом из какой-то книги о Реактивной какао и я застрял с этим: Вот мои фото-код импортера:RACSignal от rac_sequance не доставляющие сигналы правильно

+ (RACSignal *)importPhotos { 
    NSURLRequest *request = [self popularURLRequest]; 

    return [[[[[[NSURLConnection rac_sendAsynchronousRequest:request] map:^id(RACTuple *value) { 
     return [value second]; 
    }] deliverOn:[RACScheduler mainThreadScheduler]] 
      map:^id(NSData *value) { 
       id result = [NSJSONSerialization JSONObjectWithData:value 
                  options:0 
                   error:nil]; 
       return [[[result[@"photos"] rac_sequence] map:^id(NSDictionary *photoDictionary) { 
        FRPPhotoModel *photoModel = [FRPPhotoModel new]; 
        [self configurePhotoModel:photoModel withDict:photoDictionary]; 
        [self downloadThumbnailForPhotoModel:photoModel]; 

        return photoModel; 

       }] array]; 

      }] publish] autoconnect]; 
} 

+ (void)configurePhotoModel:(FRPPhotoModel *)photoModel withDict:(NSDictionary *)dict { 
    photoModel.photoName = dict[@"name"]; 
    photoModel.identifier = dict[@"id"]; 
    photoModel.photographerName = dict[@"user"][@"username"]; 
    photoModel.rating = dict[@"rating"]; 
    [[self urlForImageSize:3 inArray:dict[@"images"]] subscribeNext:^(id x) { 
     photoModel.thumbnailURL = x; 
    }]; 
} 

+ (RACSignal *)urlForImageSize:(NSInteger)size inArray:(NSArray *)array { 
    return [[[[array rac_sequence] filter:^BOOL(NSDictionary *value) { 
     return [value[@"size"] integerValue] == size; 
    }] map:^id(NSDictionary *value) { 
     return value[@"url"]; 
    }] signal]; 
} 

+ (void)downloadThumbnailForPhotoModel:(FRPPhotoModel *)photoModel { 
     [[RACObserve(photoModel, thumbnailURL) flattenMap:^RACStream *(id value) { 
      return [self download:value]; 
     }] subscribeNext:^(id x) { 
      photoModel.thumbnailData = x; 
     }]; 
} 
+ (RACSignal *)download:(NSString *)urlString { 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 

    return [[NSURLConnection rac_sendAsynchronousRequest:request] map:^id(RACTuple *value) { 
     return [value second]; 
    }]; 
} 

и пользовательский интерфейс обновляются как это:

RAC(self.imageView, image) = [[RACObserve(self, photoModel.thumbnailData) filter:^BOOL(id value) { 
    return value != nil; 
}] map:^id(id value) { 
    return [UIImage imageWithData:value]; 
}]; 

Можете ли вы объяснить, почему мой интерфейс не обновляется или обновляется неправильно с новыми UIImages, которые я получаю от объектов NSData.

ответ

0

Итак, первая проблема заключалась в том, что flattenMap поставляет на некоторый фон RACScheduler. Измененный к этому:

[[[[RACObserve(photoModel, thumbnailURL) ignore:nil] flattenMap:^RACStream *(id value) { 
    return [self download:value]; 
}] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) { 
    photoModel.thumbnailData = x; 
}]; 

Также другая проблема заключалась в том, что загрузка: ноль бросает ошибку, которая не была поймана абонентом и таким образом сигнал, который прекращается при условии значения наблюдения. Добавление ignore: nil исправлена ​​проблема.

Смежные вопросы