我正在使用郵件核心引擎發送郵件的應用程序。我創建了自己的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