Вот ленивая загрузка массива:
@property (nonatomic, strong) NSArray *dataArray;
- (NSArray *)dataArray {
if (!_dataArray) {
// if array is nil,load data
dispatch_semaphore_t signal = dispatch_semaphore_create(0);
[DataManager loadListSuccess:^(NSArray * _Nonnull list) {
self->_dataArray = list;
dispatch_semaphore_signal(signal);
} failure:^{
dispatch_semaphore_signal(signal);
}];
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
return _dataArray;
} else {
return _dataArray;
}
}
Я хочу, чтобы при вызове метода-получателя dataArray
было проверено, равно ли оно nil. Если nil, загрузите данные, затем вернитесь. Если нет, вернитесь напрямую.
Ниже приведен код данных загрузки:
+ (void)loadListSuccess:(void (^)(NSArray *list))success failure:(dispatch_block_t)failure {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
success(@[@"1", @"2", @"3"]);
});
}
В viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"viewDidLoad");
NSLog(@"self.dataArray ===== %@", self.dataArray);
NSLog(@"load finish");
}
На консоли напечатано viewDidLoad только . И все userInteractionEnabled отключены.
Однако, если я изменю метод загрузки данных на:
+ (void)loadListSuccess:(void (^)(NSArray *list))success failure:(dispatch_block_t)failure {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),queue, ^{
success(@[@"1", @"2", @"3"]);
});
}
На консоли напечатано:
- viewDidLoad
- self.dataArray ===== (
1,
2,
3
)
- загрузка закончена
Кроме того, это то, что я ожидал.
Что меня беспокоило, почему в главном потоке он не работал? Есть ли мертвая блокировка?