Показывать режим ожидания при отправке почты по SMTP-соединению ios? - PullRequest
0 голосов
/ 24 мая 2011

Я работаю над приложением, в котором я отправляю почту, используя ядро ​​mail-core.Я создал свой собственный viewController для отправки почты.Я хочу показать ожидание при отправке почты.Мой вид ожидания всегда отображается после отправки почты.Это какая-то проблема с потоками?

Вот код, который я использую для отправки почты.

- (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;     
}

Ответы [ 3 ]

1 голос
/ 28 мая 2011

Хорошо, ребята, спасибо за всю предоставленную вами информацию.Теперь проблема решена.

Я публикую здесь свой код на случай, если кому-то понадобится.

1 голос
/ 24 мая 2011

Да, это так.Вы должны вернуться к выполнению цикла, чтобы обновить пользовательский интерфейс.Таким образом, лучше всего отобразить представление ожидания в основном потоке, отправить почту в фоновом потоке, а затем снова скрыть и удалить представление ожидания в основном потоке.Вы должны обновлять пользовательский интерфейс только из основного потока.Вы можете использовать executeSelectorInBackground и executeSelectorOnMainThread, чтобы сделать это простым способом без создания потоков вручную.Вы также можете использовать dispatch_async следующим образом:

//show waiting view
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //prepare mail here

    dispatch_async(dispatch_get_main_queue(), ^{
        //send mail
        //hide waiting view
    });
});
0 голосов
/ 27 мая 2011

Поскольку вы выполняете prepareAndSendMail в главном потоке, WNAppDelegate performSelectorOnMainThread:@selector(showWaitingView) withObject:nil waitUntilDone:NO]; вызовет showWaitingView после того, как закончится текущий цикл выполнения, к которому времени вы отправите письмо. Установка waitUntilDone: в YES покажет вид ожидания в то время, когда вы намереваетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...