In the following code, how would you avoid nested blocks increasing the retain count of 'self'.
This is how I avoid nested blocks
-(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
    };
}
But how do you avoid many nested blocks, which is often the case when you use GCD within a block ?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                [self parseLoadsOfData];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self updateUI];
                });
            });
Are there retain cycles here ?
