Bijlagen bij in-app mail

Bij Afdaling App worden redelijke hoeveelheden data opgeslagen over de afgelegde route van de gebruiker. Een nieuwe functie, in een toekomende versie, is het versturen van meerdere afdalingen via email. Je kan in een overzicht meerdere afdalingen selecteren en deze vervolgens versturen per mail. Voor elke afdaling wordt, afhankelijk van instellingen, een KML of GPX bestand geëxporteerd die wordt toegevoegd aan de mail.

Dit kan enkele seconden duren voordat dit gereed is. Om de UI responsive te houden ben ik op zoek gegaan naar een oplossing om dit op de achtergrond te doen. Hier begonnen veel problemen, bijlagen die niet toegevoegd werden, etc. Uiteindelijk heb ik gekozen voor een ‘NSOperationQueue’.

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];

[queue addOperationWithBlock: ^{
	// add operation(s) to queue
	NSMutableArray *attachments = [NSMutableArray array];
	for (NSIndexPath *indexPath in [self.tableView indexPathsForSelectedRows])
	{
		// export 'afdalingen' and generate NSDictionary /w NSData for each attachment
	}

	// execute in main application thread
	[[NSOperationQueue mainQueue] addOperationWithBlock:^{
		MFMailComposeViewController* mailController = [[MFMailComposeViewController alloc] init];
		mailController.mailComposeDelegate = self;
		[mailController setSubject:@"Test"];
		[mailController setMessageBody:@"" isHTML:NO];    // betere resultaten met isHTML:NO

		for (NSDictionary *attachment in attachments) {
			[mailController addAttachmentData:[attachment valueForKey:@"file"]
									 mimeType:[attachment valueForKey:@"mimeType"]
									 fileName:[attachment valueForKey:@"fileName"]];
		}

		[self presentModalViewController:mailController animated:YES];
	}];
}];
[queue release];

Voor mij was dit de oplossing en is de update voor het nieuwe ski seizoen in de App Store te vinden, in de tussen tijd kan je bij vragen altijd even contact met mij opnemen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *