| // | |
| // EmployeeViewController.m | |
| // StoreMadApp | |
| // | |
| // Created by Andrew Smith on 7/8/13. | |
| // Copyright (c) 2013 Burgess. All rights reserved. | |
| // | |
| #import "EmployeeViewController.h" | |
| #import "Employee.h" | |
| #import "EmployeeController.h" | |
| #import <StoreMad/SMContextObserverController.h> | |
| @interface EmployeeViewController () | |
| @property (nonatomic, weak) IBOutlet UILabel *firstNameLabel; | |
| @property (nonatomic, weak) IBOutlet UILabel *lastNameLabel; | |
| @property (nonatomic, weak) IBOutlet UILabel *hireDateLabel; | |
| @property (nonatomic, weak) IBOutlet UILabel *fireDateLabel; | |
| @property (nonatomic, weak) IBOutlet UILabel *longRunningLabel; | |
| @property (nonatomic, weak) IBOutlet UIActivityIndicatorView *activity; | |
| @property (nonatomic, strong) id observer; | |
| @property (nonatomic, strong) id longObserver; | |
| @property (nonatomic, strong) NSOperationQueue *asyncQueue; | |
| @end | |
| @implementation EmployeeViewController | |
| - (void)dealloc | |
| { | |
| [[SMContextObserverController defaultController] removeContextObserver:self.observer]; | |
| [[SMContextObserverController defaultController] removeContextObserver:self.longObserver]; | |
| } | |
| + (EmployeeViewController *)newEmployeeViewControllerFromStorybaord | |
| { | |
| UIStoryboard *employeeStoryboard = [UIStoryboard storyboardWithName:[self description] | |
| bundle:nil]; | |
| EmployeeViewController *employeeVC = [employeeStoryboard instantiateViewControllerWithIdentifier:[self description]]; | |
| return employeeVC; | |
| } | |
| - (void)viewDidLoad | |
| { | |
| [super viewDidLoad]; | |
| [self configureWithEmployee:_employee]; | |
| self.longRunningLabel.hidden = YES; | |
| [self.activity stopAnimating]; | |
| // | |
| // Long running job observer | |
| // | |
| _asyncQueue = [[NSOperationQueue alloc] init]; | |
| __weak EmployeeViewController *weakSelf = self; | |
| self.longObserver = [[SMContextObserverController defaultController] addContextObserverForChangesToObject:_employee | |
| queue:_asyncQueue | |
| workBlock:^(NSManagedObject *object) { | |
| [weakSelf startLongRunningTask]; | |
| }]; | |
| } | |
| - (void)configureWithEmployee:(Employee *)employee | |
| { | |
| self.firstNameLabel.text = employee.firstName; | |
| self.lastNameLabel.text = employee.lastName; | |
| self.hireDateLabel.text = employee.hireDate.description; | |
| _fireDateLabel.hidden = !employee.isFired; | |
| [self performSelectorInBackground:@selector(createObserver) withObject:nil]; | |
| self.employee = employee; | |
| } | |
| - (void)createObserver | |
| { | |
| if (!_observer) { | |
| __weak EmployeeViewController *weakSelf = self; | |
| self.observer = [[SMContextObserverController defaultController] addContextObserverForChangesToObject:_employee | |
| workBlock:^(NSManagedObject *object) { | |
| [weakSelf configureWithEmployee:weakSelf.employee]; | |
| }]; | |
| } | |
| } | |
| #pragma mark - IBAction | |
| - (IBAction)fireEmployee:(id)sender | |
| { | |
| [EmployeeController fireEmployee:self.employee | |
| completion:^{ | |
| NSLog(@"FIRED!"); | |
| }]; | |
| } | |
| - (IBAction)hireEmployee:(id)sender | |
| { | |
| [EmployeeController hireEmployee:self.employee | |
| completion:^{ | |
| NSLog(@"Hired!"); | |
| }]; | |
| } | |
| #pragma mark - | |
| - (void)startLongRunningTask | |
| { | |
| dispatch_async(dispatch_get_main_queue(), ^{ | |
| self.longRunningLabel.hidden = NO; | |
| [self.activity startAnimating]; | |
| }); | |
| // | |
| // Sleep the current thread to demo passing in NSOperationQueue to observer | |
| // | |
| sleep(3); | |
| dispatch_async(dispatch_get_main_queue(), ^{ | |
| self.longRunningLabel.hidden = YES; | |
| [self.activity stopAnimating]; | |
| }); | |
| } | |
| @end |