В настоящий момент я изучаю возможности блоков, я прочитал более десяти раз документы для яблок), но я не могу понять поведение блоков в примерах блогов и в моем коде. Я знаю о модификаторе __block. Поэтому, пожалуйста, посмотрите на несколько моих примеров и скажите, почему это работает или нет:
1) Не работает. Нужно __block, потому что я хочу изменить объект. И самообеспечение сохраняется (правильно?) И в блогах меня пугает сохранение цикла самообслуживания. Это так?
NSDictionary *result = nil;
dispatch_async(queue, ^{
result = [self sendRequest:apiRequest];
});
2) Не работает. Я не понимаю о области видимости переменной dispatch_async (dispatch_get_main_queue (), ^ {}) ;. Он видит все локальные переменные в основном потоке или это отдельный блок от основного потока, но исключен в основном потоке? Как dispatch_async (dispatch_get_main_queue () ^ {}); копирует все локальные переменные в dispatch_async (очередь, ^ {}); и переключает семафор в основной поток.
NSDictionary *result = nil;
dispatch_async(queue, ^{
NSDictionary *data = [self sendRequest:apiRequest];
dispatch_async(dispatch_get_main_queue(), ^{
result=[data retain];
});
});
3) И примеры из блогов и Стэнфордского курса, которые меня особенно запутывают, потому что они работают.
- (void)viewWillAppear:(BOOL)animated
{
dispatch_queue_t downloadQueue = dispatch_queue_create(“image downloader”, NULL);
dispatch_async(downloadQueue, ^{
NSData *imageData = [NSData dataWithContentsOfURL:networkURL];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithData:imageData];
self.imageView.image = image;
self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
 self.scrollView.contentSize = image.size;
});
});
dispatch_release(downloadQueue);
}
Я не понимаю, потому что сначала они не упоминают о __block для себя в статьях и на уроках, во-вторых, этот код изменяет переменные, но через свойства и компилятор не дает клятву, что переменные не присваиваются и свойства изменяют ссылку, а не значение. Окончательно это работает. Заранее спасибо.