ios - 对我应该如何在 block 中使用 weakSelf 感到困惑

标签 ios objective-c parse-platform objective-c-blocks

我的代码中有很多 block 。我有一个在登录时初始化用户的过程,我使用 Parse.com 作为我的后端:

PFQuery *messageBankQuery = [PFQuery queryWithClassName:@"messageBank"];
        [messageBankQuery whereKey:@"username" equalTo:[PFUser currentUser].username];
        [messageBankQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {


            if(!error){

                [self setupUserWithMessageBank:object];

            }//end no error if


            else{

                NSLog:(@"error");

           }

}];

messageBank 是一个解析对象,它包含对用户拥有的所有消息的引用。如果找到该对象,则在 block 中调用 setupUserWithMessageBank。 setupUserWithMessageBank 还做了更多的 block 工作:

-(void)setupUserWithMessageBank: (PFObject *)object{


    __weak FriendsViewController *weakSelf = self;

    //2.)Init the user
    weakSelf.currentUser = [[appUser alloc] initWithParseUser:[PFUser currentUser] andMessageBank:object];

    //3.) Setup that message array
    [weakSelf.currentUser setupMessagedTodayWithHandler:^(BOOL successful) {

        if(successful){


            //4.)Add friends to the array
            [weakSelf.currentUser populateFriendsArrayWithCompletionHandler:^(BOOL successful, NSError *error, BOOL addSelf, BOOL alreadyFriends) {

                if(successful){

                    [self.indicator stopAnimating];
                    [self.indicator removeFromSuperview];
                    [self.tableView reloadData];

                    __weak FriendsViewController *weakSelf = self;
                    [weakSelf.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMessages) {

                        if(successful) {


                            //set the button
                            [self.navigationItem.rightBarButtonItem setAction:@selector(showMessages)];

                        }

                        else{

                            [weakSelf displayGeneralError];
                        }


                    }];//end fill messages



                }

                else{

                    [weakSelf displayGeneralError];

                }



            }];//end populate method call




        }

        else{

            [weakSelf displayGeneralError];

        }
    }];




}

我对 weakSelf 的使用有点困惑。可以在 setupUserWithMessageBank 方法的开头声明 weakSelf 吗?因为他的方法是在另一个 block 内调用的,所以从技术上讲,它是在一个 block 内创建的。我是否需要在方法内部传递 weakSelf?

我也不完全确定我应该在哪里使用 weakSelf。我需要用它来关闭事件指示器吗?任何关于我对此的使用的指示将不胜感激。谢谢!

最佳答案

如果你实际上在 self 中保留对 block 的引用(或者可能是传递性的,一个 block 保存在一个对象中,该对象保存在 self 中),你可能只需要使用 weakSelf,这在这种情况下,看起来不像你在做。在 block 中使用 weakSelf 的唯一真正原因是避免保留循环。

如果两个 block 的生命周期都很短,那么在 block 中使用 self 可能是安全的。 (如果您对 block 的生命周期有任何控制,请确保在执行后将它们设置为 nil,或者如果它们由于某些故障而没有被执行则清理它们,这样它们就不会闲逛)

关于ios - 对我应该如何在 block 中使用 weakSelf 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30068686/

相关文章:

ios - 使用 KIF 从屏幕边缘滑动(测试 UIScreenEdgePanGestureRecognizer)?

ios - 将 NSDate 转换为毫秒纪元时间

objective-c - 查看 NSUserDefaults 文件内容

objective-c - 如何在Mac上与其他用户共享iPhone应用程序?

ios - 无法分配 UIImage 类型的值?输入 PFFile?

ios - 通过 iOS 应用程序从 Parse 中删除 PFFile

ios - 在支持层的 View 上使用核心动画

ios - 使用 SwiftUI 成功登录后导航

ios - 检查日期是否在日期范围内

ios - 断点 2.1 错误解析/Facebook iOS SDK