对我应该如何在块中使用 weakSelf 感到困惑
Confusion over how I should use weakSelf in blocks
我的代码中有很多块。我有一个在登录时初始化用户的过程,我使用 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 是一个解析对象,它包含对用户拥有的所有消息的引用。如果找到该对象,则在块中调用 setupUserWithMessageBank。 setupUserWithMessageBank 也做更多的块工作:
-(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 可以吗?因为他的方法是在另一个块内调用的,所以从技术上讲,它是在一个块内创建的。我需要在方法内部传递 weakSelf 吗?
我也不完全确定我应该在哪里使用 weakSelf。我需要用它来关闭 activity 指标吗?任何关于我对此的使用的建议都将不胜感激。谢谢!
如果您实际上在 self
中保留对块的引用(或者可能是传递性的,一个块保存在一个对象中,该对象保存在自身中),您可能只需要使用 weakSelf,这在这种情况,看起来不像你在做。真正在块中使用 weakSelf 的唯一原因是避免保留循环。
如果两个块的生命周期都很短,那么在块内使用 self
可能是安全的。 (如果你对块的生命周期有任何控制,请确保它们在执行后设置为 nil,或者如果它们由于某些故障而没有被执行则被清除,这样它们就不会闲逛)
我的代码中有很多块。我有一个在登录时初始化用户的过程,我使用 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 是一个解析对象,它包含对用户拥有的所有消息的引用。如果找到该对象,则在块中调用 setupUserWithMessageBank。 setupUserWithMessageBank 也做更多的块工作:
-(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 可以吗?因为他的方法是在另一个块内调用的,所以从技术上讲,它是在一个块内创建的。我需要在方法内部传递 weakSelf 吗?
我也不完全确定我应该在哪里使用 weakSelf。我需要用它来关闭 activity 指标吗?任何关于我对此的使用的建议都将不胜感激。谢谢!
如果您实际上在 self
中保留对块的引用(或者可能是传递性的,一个块保存在一个对象中,该对象保存在自身中),您可能只需要使用 weakSelf,这在这种情况,看起来不像你在做。真正在块中使用 weakSelf 的唯一原因是避免保留循环。
如果两个块的生命周期都很短,那么在块内使用 self
可能是安全的。 (如果你对块的生命周期有任何控制,请确保它们在执行后设置为 nil,或者如果它们由于某些故障而没有被执行则被清除,这样它们就不会闲逛)