我需要并行发起7个请求,我需要启动进度条,这7个请求的响应将超过1000个记录,每个响应中将出现一个标志,以指示我是否需要发起相同的请求再次获取剩余数据。
并行我需要将这些记录保存到数据库。保存每条记录后,我需要停止进度条。
有人可以让我知道如何异步执行这些操作。
以下是我需要执行Asyncronously的步骤,
步骤1:仅针对第一个请求启动Progressbar。
第2步:开始发起请求。
第3步:检查每个回复的标记,iF' Y'再次发起相同的请求并将获取的数据保存到DB。 IF' N'将获取的数据保存到DB。(DB不应该锁定)
步骤4:使用标记“N'
重复步骤3直至完成的每个响应步骤5:一旦从服务器获得每个响应并存储到Databse,需要停止进度条。
以下是我每次都用来发起请求的选择器,
-(void)requestResponseHandling
{
[NSURLConnection sendAsynchronousRequest:targetrequest
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response,NSData *data, NSError *error)
{
[self doSomethingWithData:data];
[[[MySingleton sharedMySingleton]progressView]removeFromSuperview];
}];
[self performSelectorOnMainThread:@selector(pageLoaded:)
withObject:nil
waitUntilDone:YES];
}
以下是用于检查标志并保存到DB的选择器,
-(void)doSomethingWithData :(NSData*)data //:(NSString*)MD
{
Webservice_Response=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSError *parseError = nil;
xmlDictionary = [self dictionaryForXMLString:Webservice_Response error:&parseError];
NSDictionary *table_dict=[[xmlDictionary valueForKey:@"Response"]valueForKey:@"data"];
NSArray *table_Name=[table_dict allKeys]; //check here
NSString *DataExistsflg;
NSArray *tran_status;
if([table_Name containsObject:@"table1"])
{
tran_status= [table_dict forKey:@"table1"];
}
else if([table_Name containsObject:@"table3"])
{
tran_status= [table_dict forKey:@"table4"];
}
//Similarly for all tables i ill check here
DataExistsflg=[[[tran_status objectAtIndex:0]valueForKey:@"DATAEXISTS"]valueForKey:@"text"];
[self DataExists :DataExistsflg:moduleID];
dbwrraperOBJ = [FMDatabase databaseWithPath];
[dbwrraperOBJ open];
[self WebserviceResponse:xmlDictionary]; //Save the server resposponse to Database
[dbwrraperOBJ close];
}
我知道在保存到数据库之前,每次收到响应都会停止进度条。但我的要求是在每个步骤完成后停止进度条。
答案 0 :(得分:0)
您可以使用Dispatch_Group
:)
Dispatch_Group用于监视异步独立块的完成:)
所以这是伪代码。
在实例级别声明这些属性
let progressBar : MBProgressHUD! = nil
let group: DispatchGroup = DispatchGroup()
let queue = DispatchQueue.main
编写一个递归调用的方法来进行Web服务调用。
func makeWebServiceCall(with url : NSURL,parameters param : [String : String]) {
if progressBar == nil {
progressBar = create_your_progress_bar
progressBar.show()
}
group.enter()
Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default, headers: [AUTH_TOKEN_KEY : AUTH_TOKEN])
.responseJSON { response in
//process your json
//update your db
//check for your flag
group.leave()
if DataExistsFlag == true {
self.makeWebServiceCall(with: your_url, parameters: your_params)
}
}
group.notify(queue: queue, execute: {() -> Void in
progressBar.hide()
progressBar = nil
})
}
仔细观察您进入和离开调度组的位置。如果您输入并且未正确离开调度组,则永远不会调用group.notify
,因此您的进度条将永远不会被删除。