Hallo,
ich nutze das Framework SMPSMTPMessage, um vom iPhone Mail über SMTP zu verschicken.
Das klappt auch alles sehr gut, aber wenn größere Dateien im Anhang sind, fängt die App an zu ruckeln und der Aufruf einer URL wird geblockt, bis die Mail weg ist.
Also dachte ich, das Versenden in einen Thread zu packen und im Hintergrund laufen zu lassen.
Das mache ich so:
Der eigentliche Aufruf ist hier:
Dann geht aber keine Mail mehr raus
Ich sehe im Debugger, dass alles schön vorbereitet wird und komme bis ins das Framework hinein. In der Klasse SKPSMTPMessage.m wird in der Funkction -(BOOL)send ein Timer gesetzt, um das Timeout zu checken und außerdem werden ein NSInputStream und ein NSOutputstream geöffnet:
Alles anzeigen
Weder der Timer noch der Eventhandler der Streams werden jedoch aufgerufen und so bleibt die Mail auf der Strecke.
Wenn ich den Vorgang nicht als Thread, sondern direkt aufrufe, läuft alles wie gewünscht!
Kollidieren hier Thread und der RunLoop? Kann man das überhaupt so koppeln??
ich nutze das Framework SMPSMTPMessage, um vom iPhone Mail über SMTP zu verschicken.
Das klappt auch alles sehr gut, aber wenn größere Dateien im Anhang sind, fängt die App an zu ruckeln und der Aufruf einer URL wird geblockt, bis die Mail weg ist.
Also dachte ich, das Versenden in einen Thread zu packen und im Hintergrund laufen zu lassen.
Das mache ich so:
Der eigentliche Aufruf ist hier:
Dann geht aber keine Mail mehr raus
Ich sehe im Debugger, dass alles schön vorbereitet wird und komme bis ins das Framework hinein. In der Klasse SKPSMTPMessage.m wird in der Funkction -(BOOL)send ein Timer gesetzt, um das Timeout zu checken und außerdem werden ein NSInputStream und ein NSOutputstream geöffnet:
Quellcode
- self.connectTimer = [NSTimer scheduledTimerWithTimeInterval:connectTimeout
- target:self
- selector:@selector(connectionConnectedCheck:)
- userInfo:nil
- repeats:NO];
- [NSStream getStreamsToHostNamed:relayHost port:relayPort inputStream:&inputStream outputStream:&outputStream];
- if ((inputStream != nil) && (outputStream != nil))
- {
- sendState = kSKPSMTPConnecting;
- isSecure = NO;
- [inputStream retain];
- [outputStream retain];
- [inputStream setDelegate:self];
- [outputStream setDelegate:self];
- [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
- forMode:NSRunLoopCommonModes];
- [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
- forMode:NSRunLoopCommonModes];
- [inputStream open];
- [outputStream open];
- self.inputString = [NSMutableString string];
- return YES;
- }
- else
- {
- [self.connectTimer invalidate];
- self.connectTimer = nil;
- [delegate messageFailed:self
- error:[NSError errorWithDomain:@"SKPSMTPMessageError"
- code:kSKPSMTPErrorConnectionFailed
- userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Unable to connect to the server.", @"server connection fail error description"),NSLocalizedDescriptionKey,
- NSLocalizedString(@"Try sending your message again later.", @"server generic error recovery"),NSLocalizedRecoverySuggestionErrorKey,nil]]];
- return NO;
- }
Weder der Timer noch der Eventhandler der Streams werden jedoch aufgerufen und so bleibt die Mail auf der Strecke.
Wenn ich den Vorgang nicht als Thread, sondern direkt aufrufe, läuft alles wie gewünscht!
Kollidieren hier Thread und der RunLoop? Kann man das überhaupt so koppeln??