Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 显示加载时的等待警报视图_Ios_Objective C_Alert_Wait_Cocoaasyncsocket - Fatal编程技术网

Ios 显示加载时的等待警报视图

Ios 显示加载时的等待警报视图,ios,objective-c,alert,wait,cocoaasyncsocket,Ios,Objective C,Alert,Wait,Cocoaasyncsocket,我想当我的应用程序启动时,它会显示一个警报视图约5秒钟,然后根据后台进程的结果,它会显示另一个警报视图 我遇到的问题是,当我尝试使用睡眠来等待后台进程发生时。第一个警报不显示并等待5秒钟。应用程序显示应用程序的第一个视图,5秒后第一个警报短暂显示 我需要做什么才能实现我的愿望 这是我的密码 - (void)viewDidAppear:(BOOL)animated { SSGlobalSettings *connSettings = [SSGlobalSettings sharedMana

我想当我的应用程序启动时,它会显示一个警报视图约5秒钟,然后根据后台进程的结果,它会显示另一个警报视图

我遇到的问题是,当我尝试使用睡眠来等待后台进程发生时。第一个警报不显示并等待5秒钟。应用程序显示应用程序的第一个视图,5秒后第一个警报短暂显示

我需要做什么才能实现我的愿望

这是我的密码

- (void)viewDidAppear:(BOOL)animated
{
    SSGlobalSettings *connSettings = [SSGlobalSettings sharedManager];

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Connecting" message:@"Please wait, while your device connects" delegate:Nil cancelButtonTitle:nil otherButtonTitles: nil];
    [alertView show];

    [NSThread sleepForTimeInterval:5.0f];

    [alertView dismissWithClickedButtonIndex: alertView.cancelButtonIndex animated: YES];

    if ([connSettings.connectionStatus  isEqual: @"Not Found"])
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Connection Failed" message:@"Cannot find your device on the network" delegate:Nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alertView show];
    }
    else
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Connection Success" message:@"WYour device has been found on the network" delegate:@"OK" cancelButtonTitle:nil otherButtonTitles: nil];
        [alertView show];
    }
}

您可以改为使用PerformSelect:withObject:afterDelay:method。

您可以改为使用PerformSelect:withObject:afterDelay:method。

它无法正常工作,因为您试图告诉应用程序的主线程睡眠。如果您告诉该线程睡眠,那么您很可能不允许在此期间进行任何UI更新,因为所有UI更新都发生在主线程上

您需要做的是将用于显示第二个UIAlertView的代码移动到第二个方法,然后调用方法-voidperformSelector:SELaSelector withObject:IDanagument afterDelay:NSTimeIntervaldelay,将第二个方法传递给选择器,并给它5秒的延迟。确保删除了使主线程休眠的调用


但是,这似乎仍然是一种不好的做法,因为此操作应该在您完成后台任务后发生。因此,如果可以的话,您应该在任务完成后运行代码以显示第二个警报视图,这很可能会在不同的时间内完成。

这不正常,因为您试图告诉应用程序的主线程睡眠。如果您告诉该线程睡眠,那么您很可能不允许在此期间进行任何UI更新,因为所有UI更新都发生在主线程上

您需要做的是将用于显示第二个UIAlertView的代码移动到第二个方法,然后调用方法-voidperformSelector:SELaSelector withObject:IDanagument afterDelay:NSTimeIntervaldelay,将第二个方法传递给选择器,并给它5秒的延迟。确保删除了使主线程休眠的调用


但是,这似乎仍然是一种不好的做法,因为此操作应该在您完成后台任务后发生。因此,如果可以,您应该运行代码,在完成该任务时显示第二个警报视图,这很可能会在不同的时间内完成。

您以自己的方式阻塞了主线程


我想你只是想让用户在前5个部分之前不要做任何事情,让你成功连接?如果是这样的话,有很多方法可以做到这一点,例如在窗口顶部显示一个视图,直到你想让用户做些什么,您可以在该视图上显示“消失”按钮,也可以立即将其消失。

您可以用自己的方式阻止主线程


我想你只是想让用户在前5个部分之前不要做任何事情,让你成功连接?如果是这样的话,有很多方法可以做到这一点,例如在窗口顶部显示一个视图,直到你想让用户做些什么,您可以在该视图上显示“消失”按钮,也可以立即将其消失。

不要在主线程上使用“睡眠”。曾经也不要从后台线程更新UI

您要做的是在主线程上显示警报并返回


然后,当网络代码完成时,让它向主线程发送消息。在主线程中,当您收到已完成的通知时,删除警报

不要在主线程上使用sleep。曾经也不要从后台线程更新UI

您要做的是在主线程上显示警报并返回


然后,当网络代码完成时,让它向主线程发送消息。在主线程中,当您收到已完成的通知时,删除警报

因为您正在将警报设置为在另一个线程上运行,而不是运行UIAlertView的主线程。要使主线程休眠,只需调用sleep5,结果完全相同。我相信[NSThread sleepForTimeInterval:5.0f]确实阻止了相同的UI线程。这里是这样说的——正如Duncac所说的,你无论如何都不应该阻塞主线程。我甚至不推荐使用sleep5;这就是为什么我没有添加它作为答案。因为您正在将警报设置为在另一个线程上运行,而不是UIAlertView将在其上运行的主线程。要使主线程休眠,只需调用sleep5,结果完全相同。我相信[NSThread sleepForTimeInterval:5.0f]确实阻止了相同的UI线程。这里是这样说的——正如Duncac所说的,你无论如何都不应该阻塞主线程。我甚至不推荐使用sleep5;这就是为什么我没有添加它作为答案。是的,我首先尝试让它执行action dep
依赖于后台任务的完成。但这是对异步发生的网络广播数据包的响应的结果。它在另一条线上。此外,我试图避免在网络连接代码中包含UI代码。因此,我更新了一个共享值,应用程序在整个过程中使用该值来确定连接的状态。您可以使用-voidperformSelector:SELaSelector onThread:NSThread*thr with object:idarg waitUntilDone:BOOLwait,指定主线程,使其在主线程上执行。您还可以使用Grand Central Dispatch,这将是首选方式。但是,仅仅有一个硬编码的延迟似乎是一个非常糟糕的主意,而且它是标准的UI更改,作为网络请求完成的结果。如果您想将事情分开,您可以为网络连接代码创建自己的代理协议,以便您的UI代码与其他UI代码保持一致。谢谢Gavin,当我没有收到网络响应时,我该怎么办。我的应用程序发送一个广播数据包,要求设备以“嘿,我在这里”数据包进行响应。但如果设备不存在,则我的应用程序不会收到任何数据包。所以我需要等待或者在一段时间后超时。这样,我的用户就可以执行另一个操作了。现在发生了什么?你的网络代码已经超时了吗?是否可以指定您选择的超时?如果您可以指定一个超时,请为用户选择一个合理的等待时间,以确保如果超时存在,您将及时收到响应,并为您的网络代码设置一个委托协议,该协议包含成功和失败的委托方法。然后在UI代码中实现这些方法,并使其成为网络代码的委托。通过这种方式,您应该能够轻松地处理成功和失败两种情况。我的代码中没有超时。我要么收到回复,要么没有收到回复。基本上,接收响应的是UDP侦听器。通常需要不到一秒钟的时间来回复。我正在使用CoacaAsyncSockets-。我不相信有任何超时功能可用。我可以启动另一个线程,即超时,然后调用performSelector。是的,我首先尝试让它根据后台任务的完成来执行操作。但这是对异步发生的网络广播数据包的响应的结果。它在另一条线上。此外,我试图避免在网络连接代码中包含UI代码。因此,我更新了一个共享值,应用程序在整个过程中使用该值来确定连接的状态。您可以使用-voidperformSelector:SELaSelector onThread:NSThread*thr with object:idarg waitUntilDone:BOOLwait,指定主线程,使其在主线程上执行。您还可以使用Grand Central Dispatch,这将是首选方式。但是,仅仅有一个硬编码的延迟似乎是一个非常糟糕的主意,而且它是标准的UI更改,作为网络请求完成的结果。如果您想将事情分开,您可以为网络连接代码创建自己的代理协议,以便您的UI代码与其他UI代码保持一致。谢谢Gavin,当我没有收到网络响应时,我该怎么办。我的应用程序发送一个广播数据包,要求设备以“嘿,我在这里”数据包进行响应。但如果设备不存在,则我的应用程序不会收到任何数据包。所以我需要等待或者在一段时间后超时。这样,我的用户就可以执行另一个操作了。现在发生了什么?你的网络代码已经超时了吗?是否可以指定您选择的超时?如果您可以指定一个超时,请为用户选择一个合理的等待时间,以确保如果超时存在,您将及时收到响应,并为您的网络代码设置一个委托协议,该协议包含成功和失败的委托方法。然后在UI代码中实现这些方法,并使其成为网络代码的委托。通过这种方式,您应该能够轻松地处理成功和失败两种情况。我的代码中没有超时。我要么收到回复,要么没有收到回复。基本上,接收响应的是UDP侦听器。通常需要不到一秒钟的时间来回复。我正在使用CoacaAsyncSockets-。我不相信有任何超时功能可用。我可以启动另一个线程,即超时,然后调用performSelector。是的,这就是我正在做的。我的应用程序向设备发送UDP广播数据包,然后该设备用其自身的信息进行响应。如果设备被找到,那么它会用这些信息更新共享值,如果没有找到,那么这个共享值将保持为未找到。如果是这样,我认为通过使用警报视图,这是一种不好的方式,你可以很容易地覆盖所有ui上的一个视图,然后用户只能在此视图上进行一些交互,也许你可以输入一个等待视图
动画让用户耐心等待。在您成功连接之前,发布通知,让您等待视图捕获此通知,然后消失此视图以让用户知道您成功连接!大多数情况下,当连接成功时,开发人员将发布通知,这将很容易控制应用程序,请小心地在主线程上发布通知,以便在收到此通知时可以执行一些ui工作,否则应发送到主线程以更新ui我的情况是我正在发送广播数据包,即询问我的硬件设备是否在网络上。如果设备不在网络上,则不会收到响应。所以我需要一些等待或超时功能,这样如果设备没有响应,我可以向用户提供详细信息。是的,这就是我正在做的。我的应用程序向设备发送UDP广播数据包,然后该设备用其自身的信息进行响应。如果设备被找到,则它会用此信息更新共享值,如果未找到,则此共享值仍为未找到。如果是这样,我认为使用警报视图是一种不好的方式,您可以轻松覆盖所有ui上的视图,然后用户只能在此视图上进行一些交互,也许你可以输入一个等待动画,让用户耐心等待。在您成功连接之前,发布通知,让您等待视图捕获此通知,然后消失此视图以让用户知道您成功连接!大多数情况下,当连接成功时,开发人员将发布通知,这将很容易控制应用程序,请小心地在主线程上发布通知,以便在收到此通知时可以执行一些ui工作,否则应发送到主线程以更新ui我的情况是我正在发送广播数据包,即询问我的硬件设备是否在网络上。如果设备不在网络上,则不会收到响应。因此,我需要某种等待或超时功能,因此如果设备没有响应,我可以向用户提供详细信息。