Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Objective-C] SaveToFile

Pagina: 1
Acties:

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Ik probeer Objective-C te leren en wil graag wat ik in een NSLog heb staan naar file hebben, echter lukt het nog niet echt :P

Hieronder werkt het niet omdat ik vermoed dat newNSString binnen de loop valt. Als ik een writeToFile doe binnen de loop dan wordt er steeds een nieuw bestand gemaakt en staat alleen de laatste NSString erin. Ik wil dus eigenlijk een append doen, maar het lukt me niet echt. Kan iemand mij een duw in de juiste richting geven? :)


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NSString * newNSString = [[NSString alloc]init];
        for (int i = 1; i <= 10; i++)
        {
            NSString *strURL = [NSString stringWithFormat: @"http://www.example.nl/htm%i", i];
            strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
            NSURL *urlRequest = [NSURL URLWithString:strURL];
            NSString *html = [NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:nil];
            NSString *message = [NSString stringWithFormat:@"%@", html];
            NSString* newNSString =[[[[message componentsSeparatedByString:@"on<b>"]objectAtIndex:1] componentsSeparatedByString:@"</b"]objectAtIndex:0];
            //NSLog( @"%@", newNSString );
            newNSString = [newNSString stringByAppendingFormat:@"%@", newNSString];
            NSLog( @"%@", newNSString );
            
        }
        [newNSString writeToFile:@"/Users/squ1zzy/Desktop/html.txt" atomically:YES encoding:NSASCIIStringEncoding error:NULL];

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

File buiten de loop openen, binnen de loop eraan appenden en na de loop weer sluiten. Hetzelfde geldt voor eerst een string opbouwen: eerst een lege string definiëren, binnen de loop ernaar schrijven en buiten de loop afdrukken naar die file.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
NMe schreef op vrijdag 04 april 2014 @ 23:16:
File buiten de loop openen, binnen de loop eraan appenden en na de loop weer sluiten. Hetzelfde geldt voor eerst een string opbouwen: eerst een lege string definiëren, binnen de loop ernaar schrijven en buiten de loop afdrukken naar die file.
Hmm, zoiets dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/Users/squ1zzy/Desktop/htm.txt"];
        for (int i = 1; i <= 10; i++)
        {
            NSString *strURL = [NSString stringWithFormat: @"http://www.example.nl/html%i", i];
            strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
            NSURL *urlRequest = [NSURL URLWithString:strURL];
            NSString *html = [NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:nil];
            NSString *message = [NSString stringWithFormat:@"%@", html];
            NSString* newNSString =[[[[message componentsSeparatedByString:@"on<b>"]objectAtIndex:1] componentsSeparatedByString:@"</b"]objectAtIndex:0];
            NSLog( @"%@", newNSString );
            [fileHandle writeData:[newNSString dataUsingEncoding:NSUTF8StringEncoding]];
            
        }
        [fileHandle closeFile];


Bedankt voor het snelle antwoorden :)

[ Voor 8% gewijzigd door Squ1zZy op 04-04-2014 23:33 ]


  • Lethalis
  • Registratie: April 2002
  • Niet online
Je moet wel even controleren of de fileHandle niet toevallig nil als return value heeft.

Objective C geeft weliswaar geen null reference exception, maar momenteel is jouw code dus zo opgebouwd dat wanneer het bestand niet bestaat, er ook niets gebeurt.

Test het maar ;)

Ask yourself if you are happy and then you cease to be.


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Lethalis schreef op zaterdag 05 april 2014 @ 08:36:
Je moet wel even controleren of de fileHandle niet toevallig nil als return value heeft.

Objective C geeft weliswaar geen null reference exception, maar momenteel is jouw code dus zo opgebouwd dat wanneer het bestand niet bestaat, er ook niets gebeurt.

Test het maar ;)
Klopt, had met de hand het bestand maar even aangemaakt :)

Loop tegen een error aan though:

code:
1
2
3
NSString* newNSString =[[[[message componentsSeparatedByString:@"on<b>"]objectAtIndex:1] componentsSeparatedByString:@"</b"]objectAtIndex:0];

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds


Dacht eerst dat ik een NULL value terug krijg waardoor die crasht, maar lijkt erop dat de arrayindex het niet aan kan. Dat wordt weer googlen :)

  • Lethalis
  • Registratie: April 2002
  • Niet online
Staat "on<b>" wel in de message?

Ask yourself if you are happy and then you cease to be.


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Lethalis schreef op zaterdag 05 april 2014 @ 09:39:
Staat "on<b>" wel in de message?
Ja, maar ik weet niet of dat altijd zo is. Ik krijg wel waardes terug, maar klapt er bij de 20e alweer uit. Ben aan het kijken wat de 20e zou moeten zijn :)

Edit: Nope, er zitten een paar tussen waar geen waarde terug komt en daar dus crasht. Ga eens kijken of ik een try catch erin kan bouwen.

Edit1: Heb het nu zo :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/Users/squ1zzy/Desktop/htm.txt"];
        for (int i = 1; i <= 1000; i++)
        {
            NSString *strURL = [NSString stringWithFormat: @"http://www.example.nl/htm%i", i];
            strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
            NSURL *urlRequest = [NSURL URLWithString:strURL];
            NSString *html = [NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:nil];
            NSString *message = [NSString stringWithFormat:@"%@", html];
            NSString *newNSString = @"";
            @try {
                newNSString =[[[[message componentsSeparatedByString:@"on<b>"]objectAtIndex:1] componentsSeparatedByString:@"</b"]objectAtIndex:0];
            }
            @catch (NSException *exception) {
            }
            NSString *newNSString1=[NSString stringWithFormat:@"%@\n",newNSString];
            //NSLog( @"%i %@", i, newNSString1 );
            [fileHandle writeData:[newNSString1 dataUsingEncoding:NSUTF8StringEncoding]];
            
        }
        [fileHandle closeFile];


Of het netjes geschreven is weet ik niet, maar het werkt :+

En het volgende niet vergeten natuurlijk:

code:
1
2
3
4
if(fileHandle == nil) {
      [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil];
      fileHandle = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
 }

[ Voor 91% gewijzigd door Squ1zZy op 05-04-2014 10:28 ]


  • Lethalis
  • Registratie: April 2002
  • Niet online
componentsSeparatedByString geeft een NSArray terug.

Daar zou je de count van kunnen controleren voordat je een objectAtIndex doet.

try catch moet je alleen gebruiken wanneer er zich een situatie voordoet die je niet kunt voorkomen.

Ask yourself if you are happy and then you cease to be.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Een try/catch gebruiken alleen omdat je een exception krijgt is inderdaad niet erg handig. Je code gaat dan continu "springen" naar andere punten, of je gaat zoals hier vanalles nesten of korte stukjes code met nietszeggende try/catch-blokken omvatten. Het is inderdaad veel beter om vooraf te kijken of je aan je criterium voldoet en áls dat zo is pas je operatie uit te voeren.

Een exception is precies dat: een uitzondering. Als je hem nodig hebt als deel van je normale program flow, dan is er iets niet helemaal goed. Let wel: garbled input is alleen een geschikt om met try/catch af te vangen als die garbled input om een of andere reden niet voor mág komen, bijvoorbeeld als je met een API aan het werken bent die altijd een bepaalde string terug móét geven maar dat blijkbaar niet doet.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Duidelijk :)

code:
1
2
3
4
5
6
7
if ([message rangeOfString:@"on"].location != NSNotFound)
            {
                newNSString =[[[[message componentsSeparatedByString:@"on<b>"]objectAtIndex:1] componentsSeparatedByString:@"</b"]objectAtIndex:0];
                NSString *newNSString1=[NSString stringWithFormat:@"%@\n",newNSString];
                //NSLog( @"%i %@", i, newNSString1 );
                [fileHandle writeData:[newNSString1 dataUsingEncoding:NSUTF8StringEncoding]];
            }


Zoiets? :)

  • Carbon
  • Registratie: Juni 2001
  • Laatst online: 21-11 11:53

Carbon

4800Wp + 5400Wp

Even uit de losse pols

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/Users/squ1zzy/Desktop/htm.txt"];

for (int i = 1; i <= 1000; i++) {

    NSString *strURL = [NSString stringWithFormat: @"http://www.example.nl/htm%i", i];
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
    NSURL *urlRequest = [NSURL URLWithString:strURL];
    NSString *html = [NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:nil];

    NSArray* components = [[html componentsSeparatedByString:@"on<b>"];

    if([components count] > 1) {

        components  =  [[components objectAtIndex: 1] componentsSeparatedByString:@"</b"];
    
        if(components > 0) {
    
            NSString* newString =  [[components objectAtIndex: 0] stringByAppendingString: @"\n"];
        
            [fileHandle writeData:[newString dataUsingEncoding:NSUTF8StringEncoding]];
        }
    }
}
[fileHandle closeFile];


btw Persoonlijk (zeker onder iOS) zou ik de loop body binnen een @autorelease blok zetten!

code:
1
2
3
4
5
6
7
8
9
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/Users/squ1zzy/Desktop/htm.txt"];

for (int i = 1; i <= 1000; i++) {
   @autorelease {
    <code>
   }

}
[fileHandle closeFile];

[ Voor 13% gewijzigd door Carbon op 05-04-2014 17:52 ]


  • Carbon
  • Registratie: Juni 2001
  • Laatst online: 21-11 11:53

Carbon

4800Wp + 5400Wp

NMe schreef op zaterdag 05 april 2014 @ 12:15:
Een try/catch gebruiken alleen omdat je een exception krijgt is inderdaad niet erg handig.
Exception handling is ook relatief kostbaar kwa cpu tijd.

Bij sommige implementaties geeft een try block extra overhead.

Een bijkomend Objective-C probleem is dat ARC bij de default compiler instelling niet exception save is!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Carbon schreef op zaterdag 05 april 2014 @ 17:36:
btw Persoonlijk (zeker onder iOS) zou ik de loop body binnen een @autorelease blok zetten!
Ik heb zelf maar één keer met Objective-C gewerkt en dat wil ik het liefst heel snel weer vergeten, maar is zo'n autorelease-blok echt nodig als je een ARC-project hebt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
NMe schreef op zaterdag 05 april 2014 @ 18:55:
[...]

Ik heb zelf maar één keer met Objective-C gewerkt en dat wil ik het liefst heel snel weer vergeten, maar is zo'n autorelease-blok echt nodig als je een ARC-project hebt?
Volgens mij niet. Alles valt in de @autoreleasepool?
Snel weer vergeten? Ik vind het ook lastig, zeker gezien ik weinig ervaring heb, maar iets nieuws leren blijft leuk :)

  • Carbon
  • Registratie: Juni 2001
  • Laatst online: 21-11 11:53

Carbon

4800Wp + 5400Wp

NMe schreef op zaterdag 05 april 2014 @ 18:55:
[...]

Ik heb zelf maar één keer met Objective-C gewerkt en dat wil ik het liefst heel snel weer vergeten, maar is zo'n autorelease-blok echt nodig als je een ARC-project hebt?
Het is niet nodig maar het reduceert zeker in dit geval wel de memory footprint tijdens de loop, en ja dat geldt ook voor ARC!

Zie ook: Using Autorelease Pool Blocks

en

Objective-C Automatic Reference Counting (ARC)

Paragraaf 3.2.2 (Retained return values) en 3.2.3 (Unretained return values)

[ Voor 16% gewijzigd door Carbon op 05-04-2014 20:44 ]

Pagina: 1