0

UIViewController 解除分配时如何在 Objective C 中触发阻塞事件。

例如 :

   [PGMemberObj requestWithUserName:@"ab" andPassword:@"cc" andCallback:^(BOOL isSuc){
        if (isSuc) {
            NSLog("Login Suc.");
        }else
        {
            NSLog("Login Failed");
        }
    }];

当我弹出 ViewController 并执行 dealloc 时,我仍然收到 Login Suc。或登录失败消息。如何避免这个问题?

4

5 回答 5

2

尝试使用以下代码:

__weak UIViewController *weakSelf = self;
[PGMemberObj requestWithUserName:@"ab" andPassword:@"cc" andCallback:^(BOOL isSuc){
    if ([weakSelf isViewLoaded] && [weakSelf.view window]) 
        //The view controller still exists AND it's being shown on screen
    else
        //Either dealloc'd or not on screen anymore
 }];

它将测试您的视图控制器是否仍然存在并且仍在屏幕上。只需检查weakSelf您是否不在乎它是否仍在屏幕上显示。

if (weakSelf)
    //Still exists
else
    //dealloc'd
于 2013-10-22T08:23:43.287 回答
1

如果我理解正确,如果您的视图控制器不再存在,您想停止执行该块吗?这有点棘手,因为块被发送到您的 PGMemberObj,因此您的视图控制器不再对块代码有任何控制权。取消必须在您的PGMemberObj requestWithUserName方法中执行块的地方完成。也许您可以为视图控制器设置一个 __block 变量,并在触发回调之前检查它是否已被释放。

于 2013-10-22T08:19:28.090 回答
0

我能想到的最佳解决方案是在不再需要身份验证时取消身份验证。这意味着您PGMemberObj应该包含一个cancel(或类似的)方法来取消其身份验证过程。

另一种方法是将块重置为nil. 在这种情况下,您PGMemberObj应该有一个成员对象来保存身份验证回调块,以及一个copy属性。

您将调用该cancel方法,或重置block您的dealloc方法内部。

于 2013-10-22T08:20:46.847 回答
0

您的完成块通常是辅助线程。

你可以尝试类似的东西,

  [PGMemberObj requestWithUserName:@"ab" andPassword:@"cc" andCallback:^(BOOL isSuc){
        if (isSuc)
        {
            NSLog(@"Login Suc.");
            [self.navigationController popViewControllerAnimated:YES];
        } 
        else
        {
            NSLog(@"Login Failed");
            UIAlertView *al=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Invalid username or password" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [al show];

        }
    }];
于 2013-10-22T08:21:59.027 回答
0

你可以尝试这样的事情:

__weak id *myWeakSelf = self;
[PGMemberObj requestWithUserName:@"ab" andPassword:@"cc" andCallback:^(BOOL isSuc) {

    if (!myWeakSelf)
        return;

    if (isSuc) {
        NSLog("Login Suc.");
    }else
    {
        NSLog("Login Failed");
    }
}];

使用weak对 self 的引用将允许检测块主体在self被释放后何时执行。实际上,在这种情况下myWeakSelf会发现nil在块的开头。

如果您想完全阻止调用该块,则需要设置一些机制,以便您的PGMemberObj对象确实知道不应再执行该块。在这种情况下,再一次,弱引用可能会派上用场,您可以设置您的weak属性,PGMemberObj以便在请求对象被释放时它将被 nil-ed(在这种情况下,您将只能有一个未完成的请求) .

于 2013-10-22T08:22:36.933 回答