ReactiveCocoa / ReactiveViewModel

Model-View-ViewModel, using ReactiveCocoa
MIT License
1.96k stars 259 forks source link

code inside [self.didBecomeActiveSignal subscribeNext:^(id x) {}] not called. #45

Closed PhamPhiPhuc closed 9 years ago

PhamPhiPhuc commented 9 years ago

I'm learning to use ReactiveViewModel by following some examples:

but when I used didBecomeActiveSignal, code in subscribeNext not called

Here is my code:

MuseumsListViewModel.m

#import "MuseumsListViewModel.h"
#import "Museum.h"
#import "MuseumItemViewModel.h"
#import "JSONServices.h"
#import "Constants.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
#import <LinqToObjectiveC/NSArray+LinqExtensions.h>

@implementation MuseumsListViewModel

- (instancetype)init {
    self = [super init];
    if (self) {
        @weakify(self)
        [self.didBecomeActiveSignal subscribeNext:^(id x) {
            NSLog(@"didBecomeActiveSignal");
            @strongify(self);
            [self getMuseumsSignal];
        }];
    }
    return self;
}

- (RACSignal *)getMuseumsSignal {
    return
    [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [JSONServices loadJSONFromURL:MUSEUMS_LIST_URL parseToClass:[MuseumsList class] completion:^(id object) {
            MuseumsList *museumsList = (MuseumsList *)object;
            if (self.museums == nil) {
                self.museums = [[NSMutableArray alloc] init];
            }
            [self.museums addObjectsFromArray:[museumsList.data linq_select:^id(Museum *museum) {
                return [[MuseumItemViewModel alloc] initWithMuseum:museum];
            }]];
            self.meta = museumsList.meta;
        } failure:^(NSError *error) {
            NSLog(@"Error: %@", error);
        }];
        return nil;
    }];
}

@end

MuseumsListViewController.m

#import "MuseumsListViewController.h"

@interface MuseumsListViewController ()

@end

@implementation MuseumsListViewController

- (instancetype)initWithViewModel:(MuseumsListViewModel *)viewModel {
    self = [super init];
    if (self ) {
        self.viewModel = viewModel;
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

AppDelegate.m

#import "AppDelegate.h"
#import "MuseumsListViewModel.h"
#import "MuseumsListViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    MuseumsListViewModel *museumsListViewModel = [[MuseumsListViewModel alloc] init];
    MuseumsListViewController *museumsListViewController = [[MuseumsListViewController alloc] initWithViewModel:museumsListViewModel];
    self.window.rootViewController = museumsListViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

@end

Did I miss something? Or I did something wrong? Can you help me? Thank you.

joshaber commented 9 years ago

You need to set the view model's active property to YES.

PhamPhiPhuc commented 9 years ago

Thank you very much, I missed it. It's working now.