🗊Objective-C Блоки (Block)

Категория: Авто/мото
Нажмите для полного просмотра!
Objective-C Блоки (Block), слайд №1Objective-C Блоки (Block), слайд №2Objective-C Блоки (Block), слайд №3Objective-C Блоки (Block), слайд №4Objective-C Блоки (Block), слайд №5Objective-C Блоки (Block), слайд №6Objective-C Блоки (Block), слайд №7Objective-C Блоки (Block), слайд №8Objective-C Блоки (Block), слайд №9Objective-C Блоки (Block), слайд №10Objective-C Блоки (Block), слайд №11Objective-C Блоки (Block), слайд №12Objective-C Блоки (Block), слайд №13Objective-C Блоки (Block), слайд №14Objective-C Блоки (Block), слайд №15Objective-C Блоки (Block), слайд №16Objective-C Блоки (Block), слайд №17Objective-C Блоки (Block), слайд №18Objective-C Блоки (Block), слайд №19Objective-C Блоки (Block), слайд №20Objective-C Блоки (Block), слайд №21Objective-C Блоки (Block), слайд №22Objective-C Блоки (Block), слайд №23Objective-C Блоки (Block), слайд №24Objective-C Блоки (Block), слайд №25Objective-C Блоки (Block), слайд №26Objective-C Блоки (Block), слайд №27Objective-C Блоки (Block), слайд №28Objective-C Блоки (Block), слайд №29Objective-C Блоки (Block), слайд №30Objective-C Блоки (Block), слайд №31Objective-C Блоки (Block), слайд №32Objective-C Блоки (Block), слайд №33Objective-C Блоки (Block), слайд №34Objective-C Блоки (Block), слайд №35Objective-C Блоки (Block), слайд №36Objective-C Блоки (Block), слайд №37Objective-C Блоки (Block), слайд №38Objective-C Блоки (Block), слайд №39Objective-C Блоки (Block), слайд №40Objective-C Блоки (Block), слайд №41

Содержание

Вы можете ознакомиться и скачать Objective-C Блоки (Block). Презентация содержит 41 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Objective-C Блоки (Block)
Описание слайда:
Objective-C Блоки (Block)

Слайд 2





Тип и литерал блока
typedef int (^MyBlock)(int);   
int multiplier = 7;
MyBlock myBlock = ^(int num) {
   return num * multiplier;
};
                       ИЛИ
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
  return num * multiplier;
};
Описание слайда:
Тип и литерал блока typedef int (^MyBlock)(int); int multiplier = 7; MyBlock myBlock = ^(int num) { return num * multiplier; }; ИЛИ int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; };

Слайд 3





Вызов блока
{
   ...
   myBlock( 3 );
   //или
   if ( myBlock )
      myBlock( 3 );
}
Результат: 21
Описание слайда:
Вызов блока { ... myBlock( 3 ); //или if ( myBlock ) myBlock( 3 ); } Результат: 21

Слайд 4





Контекст блока
1. примитивные типы
 int multiplier = 7;
 int (^myBlock)(int) = ^(int num) {
   return num * multiplier;
 };
 multiplier = 8;
 NSLog( @"%d", myBlock( 3 ) );
Печатает: 21
Описание слайда:
Контекст блока 1. примитивные типы int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; multiplier = 8; NSLog( @"%d", myBlock( 3 ) ); Печатает: 21

Слайд 5





Контекст блока
2. ключевое слово __block
 __block int multiplier = 7;
 
 int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
 };
 
 multiplier = 8;
 NSLog( @"%d", myBlock( 3 ) );
Печатает: 24
Описание слайда:
Контекст блока 2. ключевое слово __block __block int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; multiplier = 8; NSLog( @"%d", myBlock( 3 ) ); Печатает: 24

Слайд 6





Контекст блока
3. переменные – указатели на объекты 
с подсчетом ссылок (id, NSObject)
 
 NSDate* date = [ [ NSDate alloc ] init ];
 void (^printDate)() = ^() {
   NSLog( @"date: %@", date );
 };
 //копируем блок в кучу
 printDate = [ [ printDate copy ] autorelease ];
 [ date release ];
 printDate();
Описание слайда:
Контекст блока 3. переменные – указатели на объекты с подсчетом ссылок (id, NSObject) NSDate* date = [ [ NSDate alloc ] init ]; void (^printDate)() = ^() { NSLog( @"date: %@", date ); }; //копируем блок в кучу printDate = [ [ printDate copy ] autorelease ]; [ date release ]; printDate();

Слайд 7





Контекст блока
4a. управление памятью
 
 NSDate* date = [ [ NSDate alloc ] init ];
 
//создаем блок в стеке
 void (^printDate)() = ^() {
   NSLog( @"date: %@", date );
 };
 
 [ date release ];
 //копируем блок в кучу и падаем
 printDate = [ [ printDate copy ] autorelease ];
Описание слайда:
Контекст блока 4a. управление памятью NSDate* date = [ [ NSDate alloc ] init ]; //создаем блок в стеке void (^printDate)() = ^() { NSLog( @"date: %@", date ); }; [ date release ]; //копируем блок в кучу и падаем printDate = [ [ printDate copy ] autorelease ];

Слайд 8





Контекст блока
4b. управление памятью
__block NSDate* date = [ [ NSDate alloc ] init ];
void (^printDate)() = ^() {
   //здесь падаем при обращении к date
   NSLog( @"date: %@", date );
};
//копируем блок в кучу, для объекта date retain не вызывается
printDate = [ [ printDate copy ] autorelease ];
[ date release ];
printDate();
Описание слайда:
Контекст блока 4b. управление памятью __block NSDate* date = [ [ NSDate alloc ] init ]; void (^printDate)() = ^() { //здесь падаем при обращении к date NSLog( @"date: %@", date ); }; //копируем блок в кучу, для объекта date retain не вызывается printDate = [ [ printDate copy ] autorelease ]; [ date release ]; printDate();

Слайд 9





Блоки и управление памятью
1. отложенный вызов
void (^printDate)() = ^() {
   NSLog( @”Hello ” );
 };
//добавление в контейнер
printDate = [ [ printDate copy ] autorelease ];
[ NSMutableArray arrayWithObject: printDate ];
self.simpleBlock = printDate;
//всегда копируем block property
@property ( copy ) JFFSimpleBlock simpleBlock;
Описание слайда:
Блоки и управление памятью 1. отложенный вызов void (^printDate)() = ^() { NSLog( @”Hello ” ); }; //добавление в контейнер printDate = [ [ printDate copy ] autorelease ]; [ NSMutableArray arrayWithObject: printDate ]; self.simpleBlock = printDate; //всегда копируем block property @property ( copy ) JFFSimpleBlock simpleBlock;

Слайд 10





Блоки и управление памятью
2. block как результат функции
-(JFFSimpleBlock)example
{
   return [ [ ^
   {
      NSLog( @"test" );
   } copy ] autorelease ];
}
Описание слайда:
Блоки и управление памятью 2. block как результат функции -(JFFSimpleBlock)example { return [ [ ^ { NSLog( @"test" ); } copy ] autorelease ]; }

Слайд 11





Блоки и управление памятью
3. Виды блоковых объектов
Глобальные - без состояния
Локальные - в стеке
Malloc - Блоки в куче
Ios < 4.0 support:
PLBlocks - googlecode
ESBlocksRuntime – github
Описание слайда:
Блоки и управление памятью 3. Виды блоковых объектов Глобальные - без состояния Локальные - в стеке Malloc - Блоки в куче Ios < 4.0 support: PLBlocks - googlecode ESBlocksRuntime – github

Слайд 12





Управление памятью и Блоки
Описание слайда:
Управление памятью и Блоки

Слайд 13





Automatic Reference Counting
No copy, release and autorelease
Описание слайда:
Automatic Reference Counting No copy, release and autorelease

Слайд 14





Блоки
Best practice
1. Работа с контейнерами на примере NSArray
2. Охраняющие выражения - guards
3. Отложенные вызовы:
onDeallocBlock
Scheduled operations
4. Блоки вместо делегатов в UIAlertView
Описание слайда:
Блоки Best practice 1. Работа с контейнерами на примере NSArray 2. Охраняющие выражения - guards 3. Отложенные вызовы: onDeallocBlock Scheduled operations 4. Блоки вместо делегатов в UIAlertView

Слайд 15





NSArray 
concurrent enumerate
NSArray* arr_ = [ NSArray arrayWithObjects: @"1"
                   , @"2”
                   , @"3”
                   , nil ];
[arr_ enumerateObjectsWithOptions: NSEnumerationConcurrent
                       usingBlock: ^( id obj_
                                    , NSUInteger idx_
                                    , BOOL* stop_)
{
    NSLog( @"start process: %@", obj_ );
    sleep( 4 );
    NSLog( @"stop process: %@", obj_ );
} ];
Описание слайда:
NSArray concurrent enumerate NSArray* arr_ = [ NSArray arrayWithObjects: @"1" , @"2” , @"3” , nil ]; [arr_ enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^( id obj_ , NSUInteger idx_ , BOOL* stop_) { NSLog( @"start process: %@", obj_ ); sleep( 4 ); NSLog( @"stop process: %@", obj_ ); } ];

Слайд 16





NSArray 
Строгая типизация vs NSPredicate
 NSArray* array_ = [ NSArray arrayWithObjects: @"1"
                      , @"2"
                      , @"3"
                      , nil ];
 
 [ array_ indexOfObjectPassingTest: ^( id obj_
	                               , NSUInteger idx_
                                      , BOOL* stop_)
 {
    NSString* element_ = obj_;
    return [ element_ isEqualToString: @"2" ];
 } ];
Описание слайда:
NSArray Строгая типизация vs NSPredicate NSArray* array_ = [ NSArray arrayWithObjects: @"1" , @"2" , @"3" , nil ]; [ array_ indexOfObjectPassingTest: ^( id obj_ , NSUInteger idx_ , BOOL* stop_) { NSString* element_ = obj_; return [ element_ isEqualToString: @"2" ]; } ];

Слайд 17





JFFLibrirary’s NSArray расширения
JFFLibrirary github
+(id)arrayWithSize:( NSUInteger )size_
          producer:( ProducerBlock )block_;
-(void)each:( ActionBlock )block_;
-(NSArray*)map:( MappingBlock )block_;
-(NSArray*)select:( PredicateBlock )predicate_;
-(NSArray*)flatten:( FlattenBlock )block_;
-(NSUInteger)count:( PredicateBlock )predicate_;
-(id)firstMatch:( PredicateBlock )predicate_;
-(void)transformWithArray:( NSArray* )other_
                withBlock:( TransformBlock )block_;
Описание слайда:
JFFLibrirary’s NSArray расширения JFFLibrirary github +(id)arrayWithSize:( NSUInteger )size_ producer:( ProducerBlock )block_; -(void)each:( ActionBlock )block_; -(NSArray*)map:( MappingBlock )block_; -(NSArray*)select:( PredicateBlock )predicate_; -(NSArray*)flatten:( FlattenBlock )block_; -(NSUInteger)count:( PredicateBlock )predicate_; -(id)firstMatch:( PredicateBlock )predicate_; -(void)transformWithArray:( NSArray* )other_ withBlock:( TransformBlock )block_;

Слайд 18





Охраняющие выражения – guards
{
   [ self beginUpdates ];
   //update rows here
   //здесь ошибка если condition_ == true, мы не вызовем    endUpdates
   if ( condition_ )
      return;
   //update rows here
   [ self endUpdates ];
}
Описание слайда:
Охраняющие выражения – guards { [ self beginUpdates ]; //update rows here //здесь ошибка если condition_ == true, мы не вызовем endUpdates if ( condition_ ) return; //update rows here [ self endUpdates ]; }

Слайд 19





Охраняющие выражения – guards
-(void)withinUpdates:( void (^)( void ) )block_
{
   [ self beginUpdates ];
   @try
   {
      block_();
   }
   @finally
   {
      [ self endUpdates ];
   }
}
Описание слайда:
Охраняющие выражения – guards -(void)withinUpdates:( void (^)( void ) )block_ { [ self beginUpdates ]; @try { block_(); } @finally { [ self endUpdates ]; } }

Слайд 20





Охраняющие выражения – guards
{
   [ self.tableView withinUpdates: ^( void )
   {
      //update rows here
      
      if ( condition_ )
         return;
      //update rows here
   } ];
}
Описание слайда:
Охраняющие выражения – guards { [ self.tableView withinUpdates: ^( void ) { //update rows here if ( condition_ ) return; //update rows here } ]; }

Слайд 21





Отложенные вызовы
onDeallocBlocks
-(void)dealloc
{
   [ [ NSNotificationCenter defaultCenter ] removeObserver: self ];
   //release ivars here if NO ARC
   [ super dealloc ];
}
ИЛИ
-(void)dealloc
{
   [ self cancelSomeOperations ];
   //release ivars here if NO ARC
   [ super dealloc ];
}
Описание слайда:
Отложенные вызовы onDeallocBlocks -(void)dealloc { [ [ NSNotificationCenter defaultCenter ] removeObserver: self ]; //release ivars here if NO ARC [ super dealloc ]; } ИЛИ -(void)dealloc { [ self cancelSomeOperations ]; //release ivars here if NO ARC [ super dealloc ]; }

Слайд 22





Отложенные вызовы
onDeallocBlocks
1. objc_setAssociatedObject( self
                           , &ownerships_key_
                           , ownerships_
                           , RETAIN_NONATOMIC );
2. Class JFFOnDeallocBlockOwner
-(void)dealloc
{
   if ( _block )
   {
      _block();
      [ _block release ];
   }
   [ super dealloc ];
}
Описание слайда:
Отложенные вызовы onDeallocBlocks 1. objc_setAssociatedObject( self , &ownerships_key_ , ownerships_ , RETAIN_NONATOMIC ); 2. Class JFFOnDeallocBlockOwner -(void)dealloc { if ( _block ) { _block(); [ _block release ]; } [ super dealloc ]; }

Слайд 23





Отложенные вызовы
onDeallocBlocks
-(void)addOnDeallocBlock:( void(^)( void ) )block_
{
  JFFOnDeallocBlockOwner* owner_ =                
  [ [ JFFOnDeallocBlockOwner alloc ] initWithBlock:             
               block_ ];
  [ self.ownerships addObject: owner_ ];
  [ owner_ release ];
}
Описание слайда:
Отложенные вызовы onDeallocBlocks -(void)addOnDeallocBlock:( void(^)( void ) )block_ { JFFOnDeallocBlockOwner* owner_ = [ [ JFFOnDeallocBlockOwner alloc ] initWithBlock: block_ ]; [ self.ownerships addObject: owner_ ]; [ owner_ release ]; }

Слайд 24





Отложенные вызовы
onDeallocBlocks
 //лечим циклическую ссылку
 __block id self_ = self;
 [ self addOnDeallocBlock: ^
 {
    [ [ NSNotificationCenter defaultCenter ] removeObserver: self_ ];
 } ];
Описание слайда:
Отложенные вызовы onDeallocBlocks //лечим циклическую ссылку __block id self_ = self; [ self addOnDeallocBlock: ^ { [ [ NSNotificationCenter defaultCenter ] removeObserver: self_ ]; } ];

Слайд 25





Отложенные вызовы
Scheduled operations
 [ self performSelector: @selector( someMethod )
             withObject: nil
             afterDelay: 20. ];
 [ NSObject cancelPreviousPerformRequestsWithTarget: self ]; //отмена
ИЛИ
 [ NSTimer scheduledTimerWithTimeInterval: 20.
                    target: self
                  selector: @selector( someMethod )
                  userInfo: nil
                   repeats: YES ];
 [ timer_ invalidate ]; //отмена
Описание слайда:
Отложенные вызовы Scheduled operations [ self performSelector: @selector( someMethod ) withObject: nil afterDelay: 20. ]; [ NSObject cancelPreviousPerformRequestsWithTarget: self ]; //отмена ИЛИ [ NSTimer scheduledTimerWithTimeInterval: 20. target: self selector: @selector( someMethod ) userInfo: nil repeats: YES ]; [ timer_ invalidate ]; //отмена

Слайд 26





Отложенные вызовы
Scheduled operations
 
 __block id self_ = self;
 
 JFFScheduledBlock bk_= ^
 {
    [ self_ someMethod ];
 }
 CancelBlock cancel_ = [ JFFScheduler addBlock: bk_
                                    duration: 20. ];
 [ self addOnDeallocBlock: cancel_  ];
Описание слайда:
Отложенные вызовы Scheduled operations __block id self_ = self; JFFScheduledBlock bk_= ^ { [ self_ someMethod ]; } CancelBlock cancel_ = [ JFFScheduler addBlock: bk_ duration: 20. ]; [ self addOnDeallocBlock: cancel_ ];

Слайд 27





Блоки вместо делегатов в UIAlertView
-(void)alertView:( UIAlertView* )alert_view_ clickedButtonAtIndex:( NSInteger )button_index_
{
  NSString* title_ = [ alert_view_ buttonTitleAtIndex: button_index_ ];
  if ( [title_ isEqualToString: cancel_ ] )
         //..
  else if ( [ title_ isEqualToString: button1_ ] )
         //..
  else if ( [ title_ isEqualToString: button2_ ] )
         //..
}
Описание слайда:
Блоки вместо делегатов в UIAlertView -(void)alertView:( UIAlertView* )alert_view_ clickedButtonAtIndex:( NSInteger )button_index_ { NSString* title_ = [ alert_view_ buttonTitleAtIndex: button_index_ ]; if ( [title_ isEqualToString: cancel_ ] ) //.. else if ( [ title_ isEqualToString: button1_ ] ) //.. else if ( [ title_ isEqualToString: button2_ ] ) //.. }

Слайд 28





Блоки вместо делегатов в UIAlertView
JFFAlertButton* bt_ = [ JFFAlertButton alertButton: title_
                                            action: ^
{
   //do some action
} ];
JFFAlertView* alert_view_ =
  [ JFFAlertView alertWithTitle: @"Alert2"
                        message: @"test"
              cancelButtonTitle: @"Cancel"
              otherButtonTitles: bt_, nil ];
Описание слайда:
Блоки вместо делегатов в UIAlertView JFFAlertButton* bt_ = [ JFFAlertButton alertButton: title_ action: ^ { //do some action } ]; JFFAlertView* alert_view_ = [ JFFAlertView alertWithTitle: @"Alert2" message: @"test" cancelButtonTitle: @"Cancel" otherButtonTitles: bt_, nil ];

Слайд 29





Обобщенное асинхронное программирование
1. Асинхронная операция в общем виде
2. Кеширование
3. Порядок выполнения
Дерево зависимостей, login
Lazy load, вычитка страниц
4. Load balancer
5. Асинхронные операции в контексте сессии
6. Асинхронные операции в UI
Описание слайда:
Обобщенное асинхронное программирование 1. Асинхронная операция в общем виде 2. Кеширование 3. Порядок выполнения Дерево зависимостей, login Lazy load, вычитка страниц 4. Load balancer 5. Асинхронные операции в контексте сессии 6. Асинхронные операции в UI

Слайд 30





Асинхронная операция в общем виде
CancelBlock (^AsyncOperation)
          ( ProgressHandler
          , CancelHandler
          , FinishHandler ) { … };
Описание слайда:
Асинхронная операция в общем виде CancelBlock (^AsyncOperation) ( ProgressHandler , CancelHandler , FinishHandler ) { … };

Слайд 31





Кеширование
Физический запрос
Описание слайда:
Кеширование Физический запрос

Слайд 32





Кэширование, API
 //физический запрос
 JFFAsyncOperation data_loader_ = ...;
 //кэшированный запрос
 JFFAsyncOperation cached_loader_ =
 [ self asyncOperationForPropertyWithName: @”image”
                    asyncOperation: data_loader_ ];
Описание слайда:
Кэширование, API //физический запрос JFFAsyncOperation data_loader_ = ...; //кэшированный запрос JFFAsyncOperation cached_loader_ = [ self asyncOperationForPropertyWithName: @”image” asyncOperation: data_loader_ ];

Слайд 33





Порядок выполнения - последовательность
sequence_ = sequenceOfAsyncOperations                   			( operation1_
                  , operation2_
			, nil );
Описание слайда:
Порядок выполнения - последовательность sequence_ = sequenceOfAsyncOperations ( operation1_ , operation2_ , nil );

Слайд 34





Порядок выполнения - группа
group_ = groupOfAsyncOperations                   			( operation1_
                  , operation2_
			, nil );
Описание слайда:
Порядок выполнения - группа group_ = groupOfAsyncOperations ( operation1_ , operation2_ , nil );

Слайд 35





Порядок выполнения – граф
ленивые вычисления
JFFAsyncOperation other_pages_ = ^( callbacks_ )
{
      NSArray* loaders_ = …;
      result_ = groupOfAsyncOp( loaders_ );
      return result_( callbacks_ );
};
sequenceOfAsyncOperations( first_page_
                         , other_pages_
                         , nil );
Описание слайда:
Порядок выполнения – граф ленивые вычисления JFFAsyncOperation other_pages_ = ^( callbacks_ ) { NSArray* loaders_ = …; result_ = groupOfAsyncOp( loaders_ ); return result_( callbacks_ ); }; sequenceOfAsyncOperations( first_page_ , other_pages_ , nil );

Слайд 36





Load balancer
Описание слайда:
Load balancer

Слайд 37





Запросы и сессия
safe_loader_ = checkSessionForLoaderBlock( loader_ )
Описание слайда:
Запросы и сессия safe_loader_ = checkSessionForLoaderBlock( loader_ )

Слайд 38





Легкий делегат
{
   [ self.clip asyncImageWithWeakDelegate: self ];
}
#pragma mark ClipDelegate
 -(void)clip:( Clip* )clip_
didLoadImage:( UIImage* )image_
       error:( NSError* )error_
{
   if ( self.clip != clip_ )
      return;
   self.imageView.image = image_;
}
Описание слайда:
Легкий делегат { [ self.clip asyncImageWithWeakDelegate: self ]; } #pragma mark ClipDelegate -(void)clip:( Clip* )clip_ didLoadImage:( UIImage* )image_ error:( NSError* )error_ { if ( self.clip != clip_ ) return; self.imageView.image = image_; }

Слайд 39





Легкий делегат
 
 JFFAsyncOperation loader_ = …;
 __block id weak_delegate_ = delegate_;
 [ weak_delegate_ weakAsyncOperation: loader_ ]
        ( nil, nil, ^( id image_, NSError* error_ )
 {
     [ weak_delegate_ clip: self
              didLoadImage: image_
                     error: error_ ];
 } );
Описание слайда:
Легкий делегат JFFAsyncOperation loader_ = …; __block id weak_delegate_ = delegate_; [ weak_delegate_ weakAsyncOperation: loader_ ] ( nil, nil, ^( id image_, NSError* error_ ) { [ weak_delegate_ clip: self didLoadImage: image_ error: error_ ]; } );

Слайд 40





Легкий делегат ARC
 JFFAsyncOperation loader_ = …;
 weak id weak_delegate_ = delegate_;
 loader_( nil
        , nil
        , ^( id image_
        , NSError* error_ )
 {
     [ weak_delegate_ clip: self
              didLoadImage: image_
                     error: error_ ];
 } );
Описание слайда:
Легкий делегат ARC JFFAsyncOperation loader_ = …; weak id weak_delegate_ = delegate_; loader_( nil , nil , ^( id image_ , NSError* error_ ) { [ weak_delegate_ clip: self didLoadImage: image_ error: error_ ]; } );

Слайд 41





Всем спасибо !!!
Email: gorbenko.vova@gmail.com
Skype: vova.gorbenko.mac
Описание слайда:
Всем спасибо !!! Email: gorbenko.vova@gmail.com Skype: vova.gorbenko.mac



Похожие презентации
Mypresentation.ru
Загрузить презентацию