首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKPSMTPMessage冻结我的程序

SKPSMTPMessage冻结我的程序
EN

Stack Overflow用户
提问于 2012-04-06 06:11:24
回答 1查看 704关注 0票数 0

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

我对NSOperation类进行了子类化,实现了有趣性,并将其添加到NSOperationQueue中,因为我不希望我的应用程序被阻塞,用户在上传图像时什么也做不了。这通常会发生,当我使用GSM网络,它持续很长时间,直到它的图像被发送。(顺便说一句,我不想对图像做任何压缩)

代码语言:javascript
复制
- (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帖子,它描述了我目前面临的问题,但是我不知道它是如何工作的。

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

代码语言:javascript
复制
[NSThread detachNewThreadSelector:@selector(launchJobWithJob:) toTarget:self withObject:jobDescription];
[[NSRunLoop currentRunLoop] run];

但是,当我不使用NSOperation子类执行此操作时,它会导致以下错误:

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

但还是不起作用。它只打印这个"C:试图连接到服务器的: mail.example.com:25“。

有人能帮忙吗?

编辑

在子类NSOperation中,我现在使用的是

代码语言:javascript
复制
[testMsg performSelectorOnMainThread:@selector(send) withObject:nil waitUntilDone:NO];

那个密码。

代码语言:javascript
复制
[testMsg send];

[[NSRunLoop currentRunLoop] run];

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-06 08:07:30

现在起作用了!我在NSOperation子类中使用了以下代码(顺便说一句:我的子类名为SMTPSendOperation):

代码语言:javascript
复制
- (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];
}

无论如何,我必须告诉用户耐心等待,直到邮件发送成功或失败。如果有人知道,我如何能够使用线程来更有效地运行,我会非常感激的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10039808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档