Доступ к NSUInteger собственности
У меня есть некоторые проблемы с доступом к свойству NSUInteger в моем коде, который выглядит так:
MyController.h
@interface MyController : UIViewController
@property (retain, nonatomic) NSArray *updatesArray;
@property (nonatomic) NSUInteger madeUpdatesCounter;
@property (nonatomic) NSUInteger allUpdatesCounter;
@end
MyController.m
@implementation MyController
@synthesize updatesArray;
@synthesize madeUpdatesCounter;
@synthesize allUpdatesCounter;
- (void)viewDidLoad
{
....
madeUpdatesCounter = 0;
allUpdatesCounter = [updatesArray count];
....
// Register for progress notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(makeProgressChange)
name:@"MadeOneUpdateNotification"
object:nil];
}
- (void)makeProgressChange
{
madeUpdatesCounter++;
NSLog(@"Update progress: %d/%d", madeUpdatesCounter, allUpdatesCounter);
}
@end
Я обрабатываю свои обновления как NSInvocationOperation, добавляя в NSOperationQueue. В конце одного действия по обновлению я отправляю уведомление:
[[NSNotificationCenter defaultCenter] postNotificationName:@"MadeOneUpdateNotification" object:nil];
После выполнения вышеуказанного кода, получение уведомлений выполняется только один раз, и в логах я вижу что-то вроде этого:
Обновление прогресса: 1/3
Когда я меняю строку:
allUpdatesCounter = [updatesArray count];
в
allUpdatesCounter = 3;
тогда все работает нормально, и я вижу в журналах: прогресс обновления: 1/3 прогресс обновления: 2/3 прогресс обновления: 3/3
Переменная updatedArray инициализируется перед загрузкой представления. Делается так:
MyController *doUpdatesVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MyController"];
doUpdatesVC.updatesArray = updatesArray;
[self presentViewController:doUpdatesVC animated:YES completion:nil];
Есть ли у вас какие-либо советы или подсказки, что я делаю неправильно в моем коде?
1 ответ
ОК, я нашел причину своих проблем. Приложения заблокированы путем доступа к той же переменной с помощью операций, запущенных из очереди. Когда я изменил логику своего кода, все стало работать правильно.