gpt4 book ai didi

ios - 显示 AlertView,进行解析并关闭 AlertView - 使用 GCD

转载 作者:行者123 更新时间:2023-11-29 03:56:40 24 4
gpt4 key购买 nike

正如上面的问题所述,我对 iOS 非常陌生;我正在尝试执行这 3 个简单的步骤。

  1. 显示提醒 View
  2. 进行解析工作
  3. 关闭提醒

我正在寻找类似 android 中的东西,即 Pre Execute、doInBackground 和 Post Execute()。

这是我尝试过的。

parserAlert = [[UIAlertView alloc] initWithTitle:@"Loading" message:@"Please Wait"    delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

[parserAlert show];

dispatch_queue_t queue = dispatch_queue_create("com.abc.testing", DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue,^{
DBHandler *myDB= [[DBHandler alloc] init];
[myDB fetchResults];
dispatch_async(dispatch_get_main_queue(),^{
[parserAlert dismissWithClickedButtonIndex:0 animated:YES];

});

});

下面是 fetchResult 方法。

- (void) fetchResults
{

IParser *i = [[IParser alloc] init];
[i startParse];


AGParser *ag = [[AGParser alloc] init];
[ag startParse];


GParser *g = [[GParser alloc] init];
[g startParse];

HParser *h = [[HParser alloc] init];
[h startParse];

SParser *s = [[SParser alloc] init];
[s startParse];


}

这是startParse。

NSString *url = @"http://abcd.com/Service_URL/Service.asmx/GetNotes";

NSURL *nsUrl = [[NSURL alloc] initWithString:url];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:nsUrl];

NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:request delegate:self];

responseData = [[NSMutableData alloc] init];

[con start];

当我运行上面的代码时,Alerview 显示并在一秒钟内关闭。在方法上添加日志我观察到 fetchresults 方法立即返回并且警报 View 被关闭。但是 fetchResults 关联的线程(连接方法、解析器方法)继续执行,但警报 View 被关闭。

我需要指导如何阻止代码直到所有关联的方法完成。

感谢您的宝贵时间。

最佳答案

我知道这不是您想要的答案,但不要为此使用警报 View 。覆盖耗时事件的一个好方法是放置一个 UIActivityIndi​​catorView 或包含一个 UIActivityIndi​​catorView 的 View ,然后将其设置为旋转:

http://www.apeth.com/iOSBook/ch25.html#_uiactivityindicatorview

您还可以使用共享应用程序对象的 beginIgnoring... 来阻止发生耗时事件时的用户交互(并使用 endIgnoring... 将其关闭) > 当你完成时)。但是,如果要为用户提供“取消”按钮,显然您不能这样做。在这种情况下,请用一个不可见的 View (清晰的背景色)覆盖其他所有内容,其 userInteractionEnabled 为 YES,这样它就会吃掉除按钮之外的任何触摸。

此外,使用 dispatch_sync 几乎永远都不是正确的答案。一旦您按照我刚才描述的方式卡住了界面,您就可以进行连接(异步)和解析(在后台线程上),然后返回主线程以关闭事件指示器。

最后,您需要给自己留一条出路,以防出现问题。例如,您可以运行 NSTimer。

编辑:现在是您实际问题的实际答案,即为什么即使我使用了 dispatch_sync 我的代码也没有暂停:这是因为 [[NSURLConnection alloc] initWithRequest:request delegate :self] 立即返回;网络位于另一个后台线程中。因此,您的 startParse 返回,您的 fetchResults 返回,同时网络继续,并在一段时间后调用 NSURLConnection 委托(delegate)方法。

关于ios - 显示 AlertView,进行解析并关闭 AlertView - 使用 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16404724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com