0

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

我对 NSOperation 类进行了子类化,实现了功能并将其添加到 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

我在这里找到了这篇文章,它描述了我目前面临的几乎相同的问题,但我不知道它是如何工作的。

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

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

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

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

但仍然无法正常工作。它再次只打印这个“C: Attempting to connect to server at: mail.example.com:25”。

有人可以帮忙吗?

编辑

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

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

那个代码。

[testMsg send];

[[NSRunLoop currentRunLoop] run];

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

4

1 回答 1

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

无论如何,我必须告诉用户耐心等待邮件发送成功或失败。如果有人有任何想法,我如何使用线程更高效地运行,我将非常感激!

于 2012-04-06T08:07:30.453 回答