2016-04-08 10 views
0

В следующем коде, как бы вы избежали вложенных блоков, увеличивая количество удержаний «я».Как управлять учетными записями в блоках очереди вложенных рассылок

Это, как я избежать вложенных блоков

-(void)openSession { 
     [self.loginManager logInWithReadPermissions:@[@"user_photos"] 
           fromViewController:[self.datasource mediaAccountViewControllerForRequestingOpenSession:self] 
              handler:[self loginHandler]]; 
} 

-(void(^)(FBSDKLoginManagerLoginResult *result, NSError *error))loginHandler { 

    __weak typeof (self) weakSelf = self; 

    return^(FBSDKLoginManagerLoginResult *result, NSError *error) { 

     __strong typeof(weakSelf) strongSelf = weakSelf; 

     if (error) { 
      [strongSelf.delegate mediaAccount:strongSelf failedOpeningSessionWithError:error]; 
     } else if (result.isCancelled) { 
      [strongSelf.delegate mediaAccountSessionOpeningCancelledByUser:strongSelf]; 
     } else { 
      [strongSelf.delegate mediaAccountDidOpenSession:strongSelf]; 
     } 

     [strongSelf notifyWithCompletion:[strongSelf completionHandler]] 
    }; 
} 

-(void)notifyWithCompletion:(void(^)(void))completion { 

    [self notify]; 
    completion(); 

} 

-(void(^)(void))completionHandler { 

    return^{ 
     //do something 
    }; 

} 

Но как же избежать множества вложенных блоков, что часто бывает при использовании НОД в блоке?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

       [self parseLoadsOfData]; 

       dispatch_async(dispatch_get_main_queue(), ^{ 

        [self updateUI]; 

       }); 

      }); 

Есть ли здесь циклы удержания?

+0

Почему, по вашему мнению, в любом из этих случаев будет цикл сохранения? – newacct

+0

Передача себя в блок. –

+0

Нет, нет * цикл *. цикл = A -> B -> A Где цикл? – newacct

ответ

0
__weak typeof(self) *weakSelfOuter = self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    __strong typeof(self) *strongInnerSelf1 = weakSelfOuter; 
    [strongInnerSelf1 parseLoadsOfData]; 
    __weak typeof(self) *weakInnerSelf = strongInnerSelf1; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     __strong typeof(self) *strongInnerSelf2 = weakInnerSelf; 
     [strongInnerSelf2 updateUI]; 
    }); 
}); 
+0

Несколько комментариев по этому поводу: - после того, как вы перехватите 'weakSelfOuter' в' strongInnerSelf1', обычно рекомендуется проверять 'strongInnerSelf1' на nil в случае, если вам действительно нужно разыменовать ivar на себе напрямую (не обязательно в этом case) - вам также не нужно повторно ослаблять 'strongInnerSelf1' до' weakInnerSelf'; во внутренней отправке обратно на главную, вы можете просто вернуть 'weakSelfOuter'. – fullofsquirrels

+0

вы ссылаетесь на «я» внутри блока дважды здесь. __weak typeof (self) и __strong typeof (self) –