1

В каждом цикле я инициализирую класс коннектора с идентификатором, который используется для выполнения вызова JSON. Проблема заключается в том, что этот цикл продолжает итерацию до того, как метод делегирования connectionDidFinishLoading класса коннектора завершится, затем проанализирует JSON, а затем использует метод делегата с информацией, которую он получил.Objective-C - цикл цикла от продолжения до вызова метода делегата

for(NSDictionary *item in views){ 

    NSInteger myID = [[item valueForKey:@"id"] integerValue]; 

//filter contains these two dictionaries 
    NSDictionary *ownerDictionary = [filterDictionary valueForKey:@"owner"]; 
    NSString *ownerDisplayName = [ownerDictionary valueForKey:@"displayName"]; 

    self.projectName = projectName; 
    self.ownerName = ownerDisplayName; 


    //value inside dictionary for owner 
    NSString *ownerDisplayName = [ownerDictionary valueForKey:@"displayName"]; 

    //I initialize the connector class here 
    self.sprintConnector = [[SprintConnector alloc] initWithId:myID]; 
    [self.sprintConnector setDelegate:self]; 



//**I do not want to continue this loop until the delegate method that i implement is called**/ 
} 

//implementation of delegate method 
-(void)didFinishLoadingStuff:(MyObject *)obj{ 

    Project *newProject = [[Project alloc] init]; 
    newProject.projectName = self.projectName; 
    newProject.projectOwner = self.ownerName; 
    newProject.sprint = sprint; 
    //Ok now i have the information that i need, lets continue our loop above 
} 

// Метод класса соединителя настроить запрос здесь:

-(void)retrieveSprintInfoWithId{ 

    NSURLConnection *conn; 
    NSString *urlString = @"myJSONURL"; 
    NSURL *url = [NSURL URLWithString:[urlString stringByAppendingString:self.ID]]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
// conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    NSLog(@"data coming from request: %@", data); 
    [self.data appendData:data]; 

} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 

    NSLog(@"we finished loading"); 
    NSError *error = nil; 

    self.projectsDict = [[NSDictionary alloc] initWithDictionary:[NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableContainers error:&error]]; 

    NSLog(@"Our sprint array with id: %@ %@", self.ID, self.projectsDict); 

//this is where we parse the JSON then use the delegate method that the above class will implement 
    [self parseJSON]; 

} 



-(void)parseJSON{ 

[self.delegate didFinishLoadingStuff:SomeObject]; 
} 

Я хочу быть в состоянии заставить метод connectionDidFinishLoading называться -> parseJSON-> метод делегата и для реализации этого метода, как указано выше, для завершения до того, как цикл продолжится.

Какие у меня варианты? Лучшие практики? и т.д?

+0

Вы не блокируете код, вы его можете завершить, вернитесь к «run loop», а затем дождитесь события, которое сообщит вам продолжить выполнение любой операции. –

+0

метод connectionDidFinishLoading в классе соединителя никогда не выполняется, но не один раз, пока цикл не будет завершен, и мне нужно его, чтобы я мог создать свой пользовательский объект в методе делегата, который я реализую. – cspam

+0

Тогда, может быть, вы зацикливаетесь в неподходящее время , –

ответ

2

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

1- Для синхронного запроса запросов вы можете использовать метод NSURLConnection sendSynchronousRequest, это будет блокироваться до тех пор, пока не будут получены данные и не будут возвращены данные, вот docs. Вам не следует делать это, так как вы можете заблокировать основной поток, который может вызвать плохой пользовательский опыт (также другие причины, почему это неверная практика).

2- Вы должны выдать свои асинхронные запросы так же, как в своем примере кода, в вашем обратном вызове вы должны получить соответствующий объект (который вы должны знать по id объекта), а затем сделать то, что вам нужно сделать с этим объектом ... Если вам нужно все, чтобы быть загруженным, чтобы принять какое-либо действие место, то вы должны следить, что (отправленные запросы против полученных ответов)

Надежда, что помогает

Daniel

+0

Спасибо, Дэниэл. Моя основная проблема заключается в том, что я теряю имя проекта и владельца, что я получаю только эти значения после завершения цикла, потому что после этого происходит разбор json и, следовательно, вызовы метода делегата. Мне нужно, чтобы метод завершенного метода соединения был вызван -> Json parsing -> и т. Д., Как показывает код до того, как цикл продолжится. Поскольку вы говорите, что все асинхронно, тогда я не уверен, что понимаю часть отслеживания запросов/ответов. – cspam

+1

@cspam. Вы не создали его правильно, не знаете, что такое filterDictionary nad ownerDictnary, но вам нужно сохранить все состояние объекта вы обрабатываете, поэтому, возможно, вместо назначения идентификатора SprintConnector назначить объект со всеми данными, которые могут вам понадобиться, или иметь дополнительное хранилище данных в ваших товарах. – Daniel

+0

Потому что мне нужно сделать два отдельных вызова json. После создания первого я могу получить идентификатор вместе с другой информацией (например, владельцем и т. Д.), Тогда я должен использовать идентификатор для отдельного вызова json (другая конечная точка), который является тем кодом, который мы обсуждаем сейчас. Я решил сделать это таким образом, вместо того чтобы идти в ногу с различными соединениями NSURL в «connectionDidFinishLoading» и сохранять все модульные. – cspam

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