簡體   English   中英

我應該如何在塊中使用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];

        }
    }];




}

我對使用softSelf感到有些困惑。 setupUserWithMessageBank方法的開始內部聲明weakSelf可以嗎? 因為他的方法是在另一個塊內調用的,所以從技術上講,它是在一個塊內創建的。 我是否需要在方法內部傳遞weakSelf?

我也不完全確定應該在哪里使用weakSelf。 我是否需要使用它來關閉活動指示器? 任何有關我對此用法的指示,將不勝感激。 謝謝!

如果您實際上在self內保留了對塊的引用(或者可能是傳遞性地,將塊保留在self內的對象中),則可能只需要使用weakSelf,在這種情況下,這看起來就不像您在做。 在塊內真正使用weakSelf的唯一原因是避免保留周期。

如果兩個模塊的生命周期都很短,那么僅在模塊內使用self可能是安全的。 (如果您對塊的生命周期有任何控制權,請確保它們在執行后設置為nil,或者如果由於某些故障而無法執行,則將其清除,以免它們徘徊)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM