2012-04-06 76 views
0

最近我決定使用SKPSMTPMessage類將圖像傳輸到服務器。SKPSMTPMessage凍結我的程序

我創建了NSOperation類的子類,實現了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];} 

需要明確的是,我釋放obect在我分配給SKPSMTMessage實例的委託。所以它不會造成任何泄漏。我不得不使用performSelectorOnMainThread:,否則它不起作用。它就停後

C: Attempting to connect to server at: mail.example.com:25

我發現this張貼在這裏,描述幾乎目前我面臨同樣的問題,但我想不通,它會如何工作的。

他們描述的解決方案是,他們曾經在另一個線程中運行程序。

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

但是,當我這樣做不使用的NSOperation子類,它使我這個錯誤:

_NSAutoreleaseNoPool(): Object 0x18a140 of class NSCFString autoreleased with no pool in place - just leaking

,但仍然沒有工作。它再次只打印這個「C:嘗試連接到服務器:mail.example.com:25」。

任何人都可以請幫忙嗎?

編輯

在子類的NSOperation我現在使用的,而不是

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

代碼。

[testMsg send]; 

[[NSRunLoop currentRunLoop] run]; 

它幫助我解決凍結問題,但沒有給出消息發送的可靠性。

回答

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

總之,我得告訴用戶,直到郵件被髮送成功或失敗的耐心。如果任何人有任何想法,我如何使用該線程運行更高效,我真的很感激!

+0

我實際上遇到了使用SKPSMTPMessage的問題。在發送電子郵件的過程中,如果用戶推到新的控制器,我允許,應用程序崩潰,直到第二個「***停止看門狗***」日誌已經作出....我想在主線程上執行此操作,凍結用戶界面,以便用戶無法在發送郵件時更改視圖....也許這不是最好的主意,但我似乎無法讓崩潰停止... – jsetting32 2013-07-09 16:54:16

+0

嗯。 weired。我可以問你嗎,你是否還將NSOperation中的邏輯打包並添加到新創建的NSOperationQueue中?如果是這樣,操作隊列只存在於推送的視圖控制器中嗎?因爲這可能是問題所在。在操作隊列被釋放之前,操作需要被取消。我建議(我也這樣做),是在UIApplicationDelegate協議的實現中創建一個NSOperationQueue。 viewcontroller只顯示數據並創建一個可發送的對象。這是我的詭計,我希望它也能幫助你! – NicTesla 2013-07-10 07:26:16