最近,我决定使用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实例的委托中释放了obect。所以这不会造成任何泄漏。
问题是,我必须使用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];它帮助我克服了冻结问题,但没有给出发送消息的可靠性。
发布于 2012-04-06 08:07:30
现在起作用了!我在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];
}无论如何,我必须告诉用户耐心等待,直到邮件发送成功或失败。如果有人知道,我如何能够使用线程来更有效地运行,我会非常感激的!
https://stackoverflow.com/questions/10039808
复制相似问题