正如上面的问题所述,我对iOS非常陌生;我试图完成以下三个简单步骤。
我在寻找类似于android的东西,即预执行、doInBackground和Post ()。
这就是我尝试过的。
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关联线程(连接方法、解析器方法)继续执行,但警报视图被拒绝。
我需要一个指导,如何阻止代码,直到所有相关的方法完成。
耽误您时间,实在对不起。
发布于 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委托方法稍后会被调用。
发布于 2013-05-06 18:34:29
下面是链接,您要寻找的是MBProgressHUD,首先在viewDidLoad中分配MBProgressHUD实例
MBProgressHUD *progressHUD = [[MBProgressHUD alloc] initWithView:self.view];
progress.delegate=self;
[progressHUD showWhileExecuting:@selector(performBackgroundTask) onTarget:self withObject:nil animated:YES]在背景法中
-(void)performBackgroundTask
{
//Do some stuff
})performBackgroundTaskmethod中的任务完成后,MBProgressHUD中显示的活动指示符将被隐藏,委托方法被调用
-(void)hudWasHidden
{
//Do additional stuff after completion of background task
}希望它能帮到你。
https://stackoverflow.com/questions/16404724
复制相似问题