Problemen met class

Problemen met class discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) Hallo, Ik ben al een tijdje bezig met een app waarin gebruik wordt gemaakt van een XML Parser. Het ontwikkelen doe ik in fases, dus ...



Ga terug   iPhone, iPod touch, iPad en Apple TV forum > Development > Ontwikkelen voor iOS
Wachtwoord vergeten? Registreren!
Registreer FAQ Ledenlijst Kalender Zoeken Berichten van vandaag Markeer forums als gelezen
  #1  
Oud 17 June 2011, 18:39
» iPhone 5s 32GB (Goud) [FW: 7.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 4.3.5]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 6 February 2010
Berichten: 121
Standaard Problemen met class

Hallo,

Ik ben al een tijdje bezig met een app waarin gebruik wordt gemaakt van een XML Parser. Het ontwikkelen doe ik in fases, dus ik verbeter de app stukje bij beetje. Nu ben ik bezig om het asynchronous laden van de xml bestanden van het internet te implementeren (ipv synchronous). Hiervoor gebruik ik ASIHTTPRequest. De XMLParser zit verwerkt in een subclass van NSObject, en bevat de NSXMLParserDelegate methods. Nu in deze XML Parser class heb ik de volgende functie staan om het parsen af te handelen (verder staan er nog delegate methods in):

Code:
-(id) loadXMLByArray:(NSArray *)urlArray {
    
    NSLog(@"first call to XML Parser");
    
    if(self.arrayOfObjects){
        [arrayOfObjects removeAllObjects];
        arrayOfObjects = nil;
        [arrayOfObjects release];
    }
    
    if(!self.arrayOfObjects){
        arrayOfObjects = [[NSMutableArray alloc] init];
    }
    
    
    if(context == nil){
        context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ObjectInfo" inManagedObjectContext:context];
    
    for (NSString *urlString in urlArray){
        NSLog(@"HOI");
        NSURL *url = [[NSURL alloc] initWithString:urlString];
        
        __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setCompletionBlock:^{
            
            // Use when fetching binary data
            NSData *responseData = [request responseData];
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:responseData];
            [parser setDelegate:self];
            [parser setShouldProcessNamespaces:NO]; // We don't care about namespaces
            [parser setShouldReportNamespacePrefixes:NO]; //
            [parser setShouldResolveExternalEntities:NO];
            [parser parse];
            [url release];
            [parser release];
            
            
            if([self.arrayOfObjects count] != 0){
                for(Object *object in self.arrayOfObjects){
                    ObjectInfo *objectInfo = [[ObjectInfo alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
                    objectInfo.ObjectContent = object.content;
                    objectInfo.ObjectDate = object.dateCreated;
                    objectInfo.ObjectUsername = object.userName;
                    objectInfo.ObjectSortDate = object.sortDate;
                    
                    NSURL *url = [NSURL URLWithString:object.urlToImage];
                    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
                    UIImage *uiImage = [UIImage imageWithData:data];
                    [data release];
                    NSData * imageData = UIImagePNGRepresentation(uiImage);
                    objectInfo.ObjectImage = imageData;
                    MyAppDelegate *theDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
                    [theDelegate saveContext];  
                    [objectInfo release];
                }
            }
            
            [self.arrayOfObjects removeAllObjects];
            
        }];
        [request setFailedBlock:^{
            NSError *error = [request error];
            NSLog(@"Error during asynchronous request (ASIHTTPRequest): %@",error);
        }];
        [request startAsynchronous];
        
    }
    
    RootViewController *rVC = [[RootViewController alloc] init];
    [rVC finishFetch];
}
Vanuit een andere class (RootViewController) initaliseer ik deze XMLParser class en start het parsen door het volgende te doen:

Code:
NSArray *arrayWithURLs = [NSArray arrayWithObjects:@"http://somedomain.com/somefeed.xml", @"http://somedomain.com/somesecondfeed", nil];
            XMLParser *xmlParser = [[XMLParser alloc] init];
            [xmlParser loadXMLByArray:arrayWithURLs];
Echter, alles werkt niet zoals het zou moeten werken. Uit de console blijkt dat de functie "loadXMLByArray" uit de XMLParser class veel vaker wordt aangeroepen dan eenmaal. Waarom is dit? Ik roep deze methode immers slechts een keer op vanuit de RootViewController class... Verder blijkt de "arrayOfObjects" ook uit de XMLParser class telkens leeg te zijn. Deze array wordt gevuld door de NSXMLParser delegate methods in de XML Parser class. Waarom wordt deze array niet gewoon gevuld? Het lijkt wel alsof er in de completion block niet gewacht wordt tot het parsen klaar is. Weet iemand wat ik verkeerd doe? (denk zelf dat het iets met die blocks te maken heeft). Bij voorbaat dank.
Advertentie
Advertentie Gesponsorde links (verdwijnt na registratie)

  #2  
Oud 18 June 2011, 20:06
» iPhone 5s 32GB (Goud) [FW: 7.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 4.3.5]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 6 February 2010
Berichten: 121
Standaard

Opgelost . Toelichting:

Aan het einde van de "loadXMLByArray" functie wordt RootViewController allocated en initialized, terwijl deze al in het geheugen stond. Verder werd de functie "loadXMLByArray" aangeroepen vanuit de viewDidLoad method in de RootViewController class. Door het opnieuw allocaten en initalizen van RootViewController wordt de viewDidLoad method opnieuw geroepen, waardoor "loadXMLByArray" ook opnieuw wordt geroepen. Dit bleef zo doorgaan en resulteert dus in een loop. De oplossing die ik heb geimplementeerd is gebruik van NSNotificationCenter om zo de functie "finishFetch" in RootViewController op te roepen.
  #3  
Oud 18 June 2011, 21:39
XIII's schermafbeelding
iPhone(club) Guru
» iPhone X 256GB (Spacegrijs) [FW: 11.2]  [Jailbreak: Nee]
» iPad Pro 10,5 Wi-Fi + 4G 256GB (Spacegrijs) [FW: 11.2]  [Jailbreak: Nee]
» Windows
 
Geregistreerd: 2 July 2009
Berichten: 9.977
Standaard

Slotje dan maar.
__________________
We are one, but we are not the same... Talk to each other!
Discussie gesloten


Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten)

 
Discussietools
Weergave

Soortgelijke discussies

Discussie Auteur Forum Reacties Laatste bericht
Variabele uit andere class halen DJ14 Ontwikkelen voor iOS 5 5 April 2011 11:28
flash class 0 sms verstutren via de Iphone? manga Jailbreak apps en thema's 9 21 October 2009 16:11
UILabel updaten vanuit andere class Niels2678 Ontwikkelen voor iOS 18 5 October 2009 12:42
Dynamic Class Loading markvwijnen Ontwikkelen voor iOS 2 16 August 2009 21:17

Regels voor berichten
Je mag geen nieuwe discussies starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit
Trackbacks are Aan
Pingbacks are Aan
Refbacks are Uit



Alle tijden zijn GMT +2. Het is nu 06:16.