通过保存到iOS

时间:2017-01-13 07:26:39

标签: ios objective-c asynchronous

我需要并行发起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];
}

我知道在保存到数据库之前,每次收到响应都会停止进度条。但我的要求是在每个步骤完成后停止进度条。

1 个答案:

答案 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,因此您的进度条将永远不会被删除。