SKPSMTPMessage冻结我的程序

时间:2012-04-06 06:11:25

标签: ios multithreading email

最近我决定使用SKPSMTPMessage类将图像传输到服务器。

我将NSOperation Class子类化,实现了funktionality并将其添加到NSOperationQueue,因为我不希望我的应用程序被阻止,并且用户在上传图像时无法执行任何操作。当我使用GSM网络并且它持续很长时间时,通常会发生这种情况,直到图像被发送为止。 (顺便说一句,我不想​​对图像进行任何压缩)

- (void)main {
SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];

testMsg.fromEmail = [[_from copy] autorelease];
testMsg.toEmail = [[_to copy] autorelease];
testMsg.relayHost = [[_relayHost copy] autorelease];
testMsg.subject = [[_subject copy] autorelease];
testMsg.delegate = self.delegate;
testMsg.parts = [[_mailParts copy] autorelease];

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

[testMsg performSelectorOnMainThread:@selector(send) withObject:nil waitUntilDone:NO];}

要清楚,我在委托中释放了指向我分配给SKPSMTMessage实例的对象。所以它不会导致任何泄漏。

问题是,我必须使用performSelectorOnMainThread:因为否则它不起作用。它在

之后立即停止
  

C:尝试连接到服务器:mail.example.com:25

我在这里发现了this,它描述了我目前面临的几乎相同的问题,但我无法弄清楚它是如何运作的。

他们描述的解决方案是,他们曾经在另一个线程中运行该程序。

[NSThread detachNewThreadSelector:@selector(launchJobWithJob:) toTarget:self withObject:jobDescription];
[[NSRunLoop currentRunLoop] run];

但是当我在不使用NSOperation子类的情况下执行此操作时,它会导致我出现此错误:

  

_NSAutoreleaseNoPool():类NSCFString的对象0x18a140自动释放,没有池 - 只是泄漏

但仍无效。它再次只显示“C:尝试连接到服务器:mail.example.com:25”。

有人可以帮忙吗?

修改

在子类NSOperation中,我现在使用而不是

[testMsg performSelectorOnMainThread:@selector(send) withObject:nil waitUntilDone:NO];

那段代码。

[testMsg send];

[[NSRunLoop currentRunLoop] run];

它可以帮助我解决冻结问题,但是没有给出发送消息的可靠性。

1 个答案:

答案 0 :(得分:0)

现在有效!我在NSOperation子类中使用以下代码(顺便说一句:我的子类名称是SMTPSendOperation):

- (void)main
{

    SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];

    testMsg.fromEmail = [[_from copy] autorelease];
    testMsg.toEmail = [[_to copy] autorelease];
    testMsg.relayHost = [[_relayHost copy] autorelease];
    testMsg.subject = [[_subject copy] autorelease];
    testMsg.delegate = self.delegate;
    testMsg.parts = [[_mailParts copy] autorelease];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    //[testMsg performSelectorOnMainThread:@selector(send) withObject:nil waitUntilDone:NO];

    //[NSThread detachNewThreadSelector:@selector(send) toTarget:<#(id)#> withObject:<#(id)#>]

    [testMsg send];



    [[NSRunLoop currentRunLoop] run];
}

无论如何,在邮件发送成功或失败之前,我必须告诉用户要有耐心。如果有人有任何想法,我如何使用线程运行更有效率,我真的很感激!