Содержание
- 2. Тип и литерал блока typedef int (^MyBlock)(int); int multiplier = 7; MyBlock myBlock = ^(int num)
- 3. Вызов блока { ... myBlock( 3 ); //или if ( myBlock ) myBlock( 3 ); }
- 4. Контекст блока 1. примитивные типы int multiplier = 7; int (^myBlock)(int) = ^(int num) { return
- 5. Контекст блока 2. ключевое слово __block __block int multiplier = 7; int (^myBlock)(int) = ^(int num)
- 6. Контекст блока 3. переменные – указатели на объекты с подсчетом ссылок (id, NSObject) NSDate* date =
- 7. Контекст блока 4a. управление памятью NSDate* date = [ [ NSDate alloc ] init ]; //создаем
- 8. Контекст блока 4b. управление памятью __block NSDate* date = [ [ NSDate alloc ] init ];
- 9. Блоки и управление памятью 1. отложенный вызов void (^printDate)() = ^() { NSLog( @”Hello ☺” );
- 10. Блоки и управление памятью 2. block как результат функции -(JFFSimpleBlock)example { return [ [ ^ {
- 11. Блоки и управление памятью 3. Виды блоковых объектов Глобальные - без состояния Локальные - в стеке
- 12. Управление памятью и Блоки
- 13. Automatic Reference Counting No copy, release and autorelease
- 14. Блоки Best practice 1. Работа с контейнерами на примере NSArray 2. Охраняющие выражения - guards 3.
- 15. NSArray concurrent enumerate NSArray* arr_ = [ NSArray arrayWithObjects: @"1" , @"2” , @"3” , nil
- 16. NSArray Строгая типизация vs NSPredicate NSArray* array_ = [ NSArray arrayWithObjects: @"1" , @"2" , @"3"
- 17. JFFLibrirary’s NSArray расширения JFFLibrirary github +(id)arrayWithSize:( NSUInteger )size_ producer:( ProducerBlock )block_; -(void)each:( ActionBlock )block_; -(NSArray*)map:( MappingBlock
- 18. Охраняющие выражения – guards { [ self beginUpdates ]; //update rows here //здесь ошибка если condition_
- 19. Охраняющие выражения – guards -(void)withinUpdates:( void (^)( void ) )block_ { [ self beginUpdates ]; @try
- 20. Охраняющие выражения – guards { [ self.tableView withinUpdates: ^( void ) { //update rows here if
- 21. Отложенные вызовы onDeallocBlocks -(void)dealloc { [ [ NSNotificationCenter defaultCenter ] removeObserver: self ]; //release ivars here
- 22. Отложенные вызовы onDeallocBlocks 1. objc_setAssociatedObject( self , &ownerships_key_ , ownerships_ , RETAIN_NONATOMIC ); 2. Class JFFOnDeallocBlockOwner
- 23. Отложенные вызовы onDeallocBlocks -(void)addOnDeallocBlock:( void(^)( void ) )block_ { JFFOnDeallocBlockOwner* owner_ = [ [ JFFOnDeallocBlockOwner alloc
- 24. Отложенные вызовы onDeallocBlocks //лечим циклическую ссылку __block id self_ = self; [ self addOnDeallocBlock: ^ {
- 25. Отложенные вызовы Scheduled operations [ self performSelector: @selector( someMethod ) withObject: nil afterDelay: 20. ]; [
- 26. Отложенные вызовы Scheduled operations __block id self_ = self; JFFScheduledBlock bk_= ^ { [ self_ someMethod
- 27. Блоки вместо делегатов в UIAlertView -(void)alertView:( UIAlertView* )alert_view_ clickedButtonAtIndex:( NSInteger )button_index_ { NSString* title_ = [
- 28. Блоки вместо делегатов в UIAlertView JFFAlertButton* bt_ = [ JFFAlertButton alertButton: title_ action: ^ { //do
- 29. Обобщенное асинхронное программирование 1. Асинхронная операция в общем виде 2. Кеширование 3. Порядок выполнения Дерево зависимостей,
- 30. Асинхронная операция в общем виде CancelBlock (^AsyncOperation) ( ProgressHandler , CancelHandler , FinishHandler ) { …
- 31. Кеширование Физический запрос Логический запрос 1 Логический запрос 2 Ответ 1 Ответ 2
- 32. Кэширование, API //физический запрос JFFAsyncOperation data_loader_ = ...; //кэшированный запрос JFFAsyncOperation cached_loader_ = [ self asyncOperationForPropertyWithName:
- 33. Порядок выполнения - последовательность sequence_ = sequenceOfAsyncOperations ( operation1_ , operation2_ , nil ); Асин. оп.1
- 34. Порядок выполнения - группа group_ = groupOfAsyncOperations ( operation1_ , operation2_ , nil ); Запрос 3
- 35. Порядок выполнения – граф ленивые вычисления JFFAsyncOperation other_pages_ = ^( callbacks_ ) { NSArray* loaders_ =
- 36. Load balancer //имя текущего контекста void setBalancerActiveContextName( NSString* name_ ); //сбалансированная асинхронная операция balanced_loader_ = balancedAsyncOperation(
- 37. Запросы и сессия safe_loader_ = checkSessionForLoaderBlock( loader_ ) Login Logout
- 38. Легкий делегат { [ self.clip asyncImageWithWeakDelegate: self ]; } #pragma mark ClipDelegate -(void)clip:( Clip* )clip_ didLoadImage:(
- 39. Легкий делегат JFFAsyncOperation loader_ = …; __block id weak_delegate_ = delegate_; [ weak_delegate_ weakAsyncOperation: loader_ ]
- 40. Легкий делегат ARC JFFAsyncOperation loader_ = …; weak id weak_delegate_ = delegate_; loader_( nil , nil
- 42. Скачать презентацию