2017-01-13 1 views
0

Мне нужно выполнить запрос 7 параллельно, и мне нужно запустить панель прогресса, ответ на этот запрос 7 будет содержать более 1000 записей, а также один флаг будет присутствовать в каждый ответ, чтобы указать, нужно ли мне снова инициировать тот же запрос, чтобы получить остальные данные.Инициировать Множественный запрос и обрабатывать ответы путем сохранения в базу данных в iOS

Параллельно мне нужно сохранить эти записи в базе данных. После сохранения каждой записи мне нужно остановить индикатор выполнения.

Может кто-нибудь, пожалуйста, дайте мне знать, как выполнять эти операции асинхронно.

Ниже приведены шаги, мне нужно выполнить асинхронном

Шаг 1: Запустить Progressbar для только первый запрос.

Шаг 2: Запустите инициирующий запрос.

Шаг 3: Проверить флаг из каждого ответа, iF 'Y' снова инициировать тот же запрос и сохранить извлеченные данные в БД. . ЕСЛИ «N» сохранить неправдоподобные данные в БД (БД не должен блокировать)

Шаг 4: Повторите шаг 3 Шифрование до каждого ответа завершено с флагом «N»

Шаг 5: После того, как каждый ответ получил от сервера и хранящиеся в Databse, необходимо остановить Progressbar.

Ниже приводится селектор я использовал, чтобы инициировали этот запрос каждый раз,

-(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]; 
} 

Ниже приводится селектор я использовал, чтобы проверить флаг и сохранить в БД,

-(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

Вы можете использовать Dispatch_Group :)

Dispatch_Group предназначен для контроля завершения асинхронных независимых блоков :)

Так вот псевдо-код.

Объявите эти свойства на уровне экземпляра

let progressBar : MBProgressHUD! = nil 
let group: DispatchGroup = DispatchGroup() 
let queue = DispatchQueue.main 

Написать метод, который будет вызывать рекурсивно для выполнения вызовов веб-служб.

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 никогда не будет вызван, поэтому ваш индикатор прогресса никогда не будет удален.

+0

Спасибо за ваш ответ. Это помогло устранить проблему – user7413163

Смежные вопросы