0

正如上面的问题所述,我对 iOS 很陌生;我试图做这 3 个简单的步骤。

  1. 显示警报视图
  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 方法立即返回并且警报视图被关闭。然而 fetchResults 相关线程(连接方法,解析器方法)继续执行,但 alerview 被解除。

我需要一个指导方针,如何在所有相关方法都完成之前阻止代码。

谢谢你的时间。

4

2 回答 2

1

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

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

您还可以在耗时的活动发生时阻止用户交互,使用共享的应用程序对象beginIgnoring...(并在完成后将其关闭endIgnoring...)。但是,如果要给用户一个取消按钮,显然你不能这样做。在这种情况下,使用 YES 的不可见视图(清晰的背景颜色)覆盖其他所有内容userInteractionEnabled,以便它吃掉除按钮之外的任何触摸。

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

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

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

于 2013-05-06T18:23:41.697 回答
0

这是您要查找的链接MBProgressHUD 首先分配它的 MBProgressHUD 实例viewDidLoad

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
}

并且一旦 )performBackgroundTask 方法中的任务完成,MBProgressHUD将隐藏的 Activity 指示器和调用的委托方法

-(void)hudWasHidden
{ 
   //Do additional stuff after completion of background task 
}

希望它会帮助你。

于 2013-05-06T18:34:29.693 回答