Objective c 在ios中更新标签后执行操作

Objective c 在ios中更新标签后执行操作,objective-c,ios,Objective C,Ios,我正在使用pin屏幕登录我的应用程序。pin屏幕由四个标签和一个隐藏的文本字段组成。当用户通过键盘输入文本时,我用符号更新标签。这可以很好地工作,只是最后一个标签在登录开始之前没有得到实际更新,并且在登录过程完成时保持为空 这些是相关的代码位: //an observer has been added elsewhere - (void)textDidChange:(NSNotification *)notification { UITextField *field = [notifi

我正在使用pin屏幕登录我的应用程序。pin屏幕由四个标签和一个隐藏的文本字段组成。当用户通过键盘输入文本时,我用符号更新标签。这可以很好地工作,只是最后一个标签在登录开始之前没有得到实际更新,并且在登录过程完成时保持为空

这些是相关的代码位:

//an observer has been added elsewhere
- (void)textDidChange:(NSNotification *)notification 
{
    UITextField *field = [notification object];
if (field == inputField) 
    {
    NSString *newText = field.text;     
    if ([newText length] <= pinLength) [self updatePINDisplay];
    }
}


-(void)updatePINDisplay 
{
    if ([pinText length] > pinLength) return;

    for (NSInteger ii = 0; ii < [pinText length]; ii++)
    {
        UILabel *label = [pinFields objectAtIndex:ii];
        [label setText:@"x"];
    }

    for (NSInteger ii = [pinText length]; ii < pinLength; ii++)
    {
    UILabel *label = [pinFields objectAtIndex:ii];
    [label setText:[NSString string]];
    }

    if ([pinText length] == pinLength) [self login];
}

但是我不喜欢随意的时间延迟。我希望可能有一个委托方法,我可以使用它在标签绘制完成后启动我的登录代码。比如:

-(void)labelDidGetDrawn
也欢迎任何其他(非黑客)解决方案:-)

谢谢

那么:

[label setNeedsDisplay:YES];
if ([pinText length] == pinLength) [self login];

根据您的描述,问题似乎是第四项直到
[自登录]
完成后才被提取,这表明登录过程需要一些时间。在iOS中,绘图不会立即发生,这就是为什么只有在操作系统有机会更新显示后才可以登录时才能获得绘图

您在这里使用了一个合理的解决方案。另一个(可以说是较少的黑客行为)是让您的
-[self login]
在单独的线程上生成登录,或者至少使用异步机制(例如NSURLConnection的异步模式,假设您正在发出网络请求)。然后你的主线程会很快地将控制权返回到iOS,你的盒子就会画出来

使用Grand Central Dispatch,您可以通过让
-[self login]
将网络代码放在后台线程上,并在完成后让后台线程回调主线程来完成大部分工作。但是,如果您想在登录过程中响应用户事件,这可能会导致一些问题


如果可以的话,异步使用
NSURLConnection
,并设置代理在操作完成时向您报告可能是最佳选择,因为如果用户请求,它可以让您在登录过程中取消
NSURLConnection

是的,在某种程度上,该通知是存在的。标签将在运行循环的下一次迭代中绘制。因此,请在下一次运行循环迭代结束时登录
,例如使用
performSelector:afterDelay:0
或使用

dispatch_async (dispatch_get_main_queue (), ^{ [self login]; });
但a)这取决于渲染的执行顺序与计时器和调度队列。如果在计时器执行之前进行渲染,则一切就绪

和b)不要阻塞主线程。尝试在后台线程/并发队列中执行登录,或者如果正在使用,则在主线程上异步执行登录,例如,
NSURLConnection

[label setNeedsDisplay:YES];
if ([pinText length] == pinLength) [self login];
dispatch_async (dispatch_get_main_queue (), ^{ [self login]; });