我正在使用邮件核心引擎发送邮件的应用程序。我创建了自己的viewController来发送邮件。我想在邮件发送过程中显示等待视图。邮件发送完成后,我的等待视图始终显示。这是一种线程问题吗?使用smtp连接发送邮件时显示等待视图?
这是我用来发送邮件的代码。
- (IBAction) sendTapped:(id) sender {
[txtfSubject resignFirstResponder];
[txtfReceptient resignFirstResponder];
[txtvMessageBody resignFirstResponder];
[self setTo:txtfReceptient.text];
[self setFrom:username];
[self setSubject:txtfSubject.text];
[self setBody:txtvMessageBody.text];
[self performSelector:@selector(prepareAndSendMail) withObject:nil afterDelay:0.34];
}
- (void) prepareAndSendMail {
[WNAppDelegate performSelectorOnMainThread:@selector(showWaitingView) withObject:nil waitUntilDone:NO];
//TODO: send mail here
CTCoreMessage *msg = [[CTCoreMessage alloc] init];
[msg setTo:[myMessage to]];
[msg setFrom:[myMessage from]];
//Encode message here
NSString *encodedMessage = nil;
@try {
encodedMessage = [self encodeMessage:txtvMessageBody.text];
}
@catch (NSException * e) {
NSLog(@"An exception occurred while encoding message");
}
@finally {
if(encodedMessage){
[msg setBody:encodedMessage];
}
}
[msg setSubject:[myMessage subject]];
BOOL success = [self sendMailOnAnotherThread:msg];
[msg release];
[WNAppDelegate performSelectorOnMainThread:@selector(removeWaitingView) withObject:nil waitUntilDone:NO];
//[appDelegate removeWaitingView];
if(!success) {
UIAlertView * empty_alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Could not send."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[empty_alert show];
[empty_alert autorelease];
return;
}
else {
//Message sent successfully
if(self.target && [self.target respondsToSelector:@selector(messageSentSuccessfully)]){
[self.target messageSentSuccessfully];
}
WN_POST_NOTIFICATION(kMessageSentSuccessfully,nil);
}
[self dismissModalViewControllerAnimated:YES];
}
- (BOOL) sendMailOnAnotherThread:(CTCoreMessage*)message {
BOOL success = YES;
BOOL auth = YES;
BOOL tls = YES;
@try {
[CTSMTPConnection sendMessage:message server:GMAIL_SERVER username:username
password:password port:GMAIL_PORT_Number useTLS:tls useAuth:auth];
}
@catch (NSException * e) {
//Msg failed to send;
success = FALSE;
}
return success;
}
您是否将UI更新移动到后端线程? – 2011-05-30 06:25:12
否我已经将UI更新移动到不在后台线程中的另一个线程,并且按预期工作。首先,它给了我NSAutoreleas池泄漏的警告,但是当我将代码放入autorelease池时,警告不在我已经在gdb中测试过的地方。 – 2011-05-30 06:39:28
有很多地方明确喊UIKit更新只能在主线程中完成,就像[this]一样(http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Framework/Introduction/ Introduction.html)。所以有可能会在稍后突破。 – 2011-05-30 06:48:18