gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:03:33 24 4
gpt4 key购买 nike

我的代码中有很多 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com