В каждом цикле я инициализирую класс коннектора с идентификатором, который используется для выполнения вызова 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-> метод делегата и для реализации этого метода, как указано выше, для завершения до того, как цикл продолжится.
Какие у меня варианты? Лучшие практики? и т.д?
Вы не блокируете код, вы его можете завершить, вернитесь к «run loop», а затем дождитесь события, которое сообщит вам продолжить выполнение любой операции. –
метод connectionDidFinishLoading в классе соединителя никогда не выполняется, но не один раз, пока цикл не будет завершен, и мне нужно его, чтобы я мог создать свой пользовательский объект в методе делегата, который я реализую. – cspam
Тогда, может быть, вы зацикливаетесь в неподходящее время , –