首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示一个AlertView,执行解析,用GCD排除AlertView

显示一个AlertView,执行解析,用GCD排除AlertView
EN

Stack Overflow用户
提问于 2013-05-06 18:18:24
回答 2查看 181关注 0票数 0

正如上面的问题所述,我对iOS非常陌生;我试图完成以下三个简单步骤。

  1. 显示警报视图
  2. 做解析的事
  3. 解散警报

我在寻找类似于android的东西,即预执行、doInBackground和Post ()。

这就是我尝试过的。

代码语言:javascript
复制
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方法。

代码语言:javascript
复制
- (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。

代码语言:javascript
复制
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关联线程(连接方法、解析器方法)继续执行,但警报视图被拒绝。

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

耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-06 18:23:41

我知道这不是你想要的答案,但不要使用警告视图。掩盖耗时活动的一种很好的方法是设置一个UIActivityIndicatorView (或包含一个视图),并将其设置为旋转:

动态指标观

您还可以在使用共享应用程序对象的beginIgnoring...进行耗时的活动时防止用户交互(当您完成时,可以通过endIgnoring...关闭它)。显然,如果要给用户一个Cancel按钮,您就不能这样做。在这种情况下,用一个不可见的视图(透明的背景色)覆盖所有的东西,userInteractionEnabled是是的,这样它就会吃掉除了按钮以外的任何东西。

而且,使用dispatch_sync几乎从来都不是正确的答案。一旦您按照我刚才描述的方式冻结了接口,您就可以只进行连接(异步)和解析(在后台线程上),然后返回到主线程以排除活动指示符。

最后,你会想给自己留出一条出路,以防事情出错。例如,您可以运行一个NSTimer。

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

票数 1
EN

Stack Overflow用户

发布于 2013-05-06 18:34:29

下面是链接,您要寻找的是MBProgressHUD,首先在viewDidLoad中分配MBProgressHUD实例

代码语言:javascript
复制
MBProgressHUD *progressHUD = [[MBProgressHUD alloc] initWithView:self.view];
progress.delegate=self;
[progressHUD showWhileExecuting:@selector(performBackgroundTask) onTarget:self withObject:nil animated:YES]

在背景法中

代码语言:javascript
复制
-(void)performBackgroundTask
{
    //Do some stuff
}

)performBackgroundTaskmethod中的任务完成后,MBProgressHUD中显示的活动指示符将被隐藏,委托方法被调用

代码语言:javascript
复制
-(void)hudWasHidden
{ 
   //Do additional stuff after completion of background task 
}

希望它能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16404724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档