Я анализирую два больших объема данных с моего веб-сервера, у меня возникло несколько проблем, но я думаю, что заблокировал их для одной проблемы, обнаруженной в методе parserDidEndDocument.
что происходит, когда я получаю if (dataSetToParse == @ "vent") Я застреваю в этом цикле, если я регистрирую результаты, он просто постоянно продолжает печатать один и тот же набор результатов для журнала снова и снова.
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
if (dataSetToParse == @"shaft"){
//Filter results shaft (isShaft = T)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"isShaft",@"T"];
NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];
//Load filteredArray into shaftFilterArray, which can be used outside of this method and passed to other views
shaftFilterArray = filteredArray;
[self.tableView reloadData]; //Reloads the tabel delegate methods
}
if (dataSetToParse == @"vent"){
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ventID",isShaftString]; //isShaftString is being set from the sub view when the user makes a isShaft selection
NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];
if ([filteredArray count] == 0){ //<<---- getting stuck in this if statment
self.removeActivityIndicator = NO; // sets indicator to be turned off once tableview has been reloaded, (tableView:cellForRowAtIndexPath:) and there are no values in the array i.e.(manufacture has no modles)
}else if([filteredArray count] !=0){
ventFilterArray = filteredArray; // ventFilterArray is passed to subview to be displayed
}
[self setRequestString:@"drain.xml"]; //Sets up the rest for submodel data that needs to be sent to subview with vent data
[self.tableView reloadData]; //Reloads the tabel delegate methods
}
}
## UPDATE
Я выяснил, почему мой парсер кажется застрявшим в бесконечном цикле, потому что он вызывается из моего делегата соединения бесконечно ..
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// do something with the data
// receivedData is declared as a method instance elsewhere
NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
if (dataSetToParse == @"shaft"){
NSData *responseData = [shaftCachedResponse data];
[self startTheParsingProcess:responseData];
}
else if (dataSetToParse == @"vent"){
NSData *responseData = [ventCachedResponse data]; //<<--- this is where things are getting stuck! with no idea why.
[self startTheParsingProcess:responseData];
}
}
не уверен, почему это происходит.
## ОБНОВЛЕНИЕ 2
Итак, я проследил делегатов соединения, чтобы увидеть, в каком порядке они вызывались и сколько раз они вызывались. и вот что происходит
для первого dataSetToParse - "вал" работает следующим образом
- setRequestString
- подключение: didReciveResponse:
- подключение: didReceiveData:
- connection: willCacheResponse: (входит в оператор if shaft )
- connection: didFinishLoading: (также вводится оператор if shaft )
закончено - выключается и анализирует данные.
для второго dataSetToParse - @ "vent" это то, что происходит.
- setRequestString
- подключение: didReciveResponse:
- подключение: didReceiveData:
- connection: willCacheResponse: (входит в оператор if shaft )
- connection: didFinishLoading: (также вводится оператор if shaft )
делегаты синтаксического анализатора вызываются так, как это происходит в первом случае, но затем делегаты соединения запускаются снова, но немного по-другому, потому что теперь кэш установлен.
- setRequestString
- подключение: didReciveResponse:
- подключение: didReceiveData:
- connection: didFinishLoading: (также вводится оператор if shaft )
и так далее и тому подобное .. постоянно повторяется ..
Один вопрос, могу ли я использовать эти делегаты соединения, как я, настраивая два разных кэша?