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: サーバーへの接続を試みています: 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 に答える