如何管理嵌套调度队列块中的保留计数

时间:2016-04-08 17:11:40

标签: ios objective-c closures

在下面的代码中,您将如何避免嵌套块增加' self'的保留计数。

这就是我避免嵌套块的方法

-(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
    };

}

但是如何避免许多嵌套块,在块中使用GCD时通常就是这种情况?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

                [self parseLoadsOfData];

                dispatch_async(dispatch_get_main_queue(), ^{

                    [self updateUI];

                });

            });

这里有保留周期吗?

1 个答案:

答案 0 :(得分: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];
    });
});