最近我决定使用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];
它可以帮助我解决冻结问题,但是没有给出发送消息的可靠性。
答案 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];
}
无论如何,在邮件发送成功或失败之前,我必须告诉用户要有耐心。如果有人有任何想法,我如何使用线程运行更有效率,我真的很感激!