2012-04-06 2 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];} 

는 명확하게하기 위해, 나는 내가 SKPSMTMessage 인스턴스에 할당 위임에 obect을 해제 (그건 그렇고, 내가 이미지에 어떤 압박을하고 싶지 않아). 그래서 누출을 일으키지 않습니다.

문제는 내가 performSelectorOnMainThread:을 사용해야한다는 것입니다. 그렇지 않으면 작동하지 않기 때문입니다. 내가 꽤 많이 나는 현재 직면하고있어 같은 문제를 설명 여기 this 게시물을 발견했지만, 나는 그것의 작동가는 방법을 알아낼 수 없습니다 바로

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

후 중지합니다.

그들이 설명한 해결책은 다른 스레드에서 프로그램을 실행하는 것이 었습니다.

[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"만 인쇄합니다.

아무도 도와 줄 수 있습니까?

지금 대신

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

그 코드의 사용 서브 클래스 NSOperation에서 편집

.

[testMsg send]; 

[[NSRunLoop currentRunLoop] run]; 

얼어 붙는 문제를 해결하는 데 도움이되지만 보내는 메시지의 신뢰성은 제공되지 않습니다.

답변

0

이제 작동합니다! 나는 NSOperation 서브 클래스에서 다음 코드를 사용하십시오 (BTW을 : 내 서브 클래스의 이름은 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를 사용하는 데 문제가 있습니다. 전자 메일을 보내는 과정에서 사용자가 허용 한 새 컨트롤러로 푸시하면 두 번째 "*** 워치 독 중지 ***"로그가 만들어 질 때까지 응용 프로그램이 다운됩니다 ... 메인 스레드에서 이것을 수행하여 메시지가 전송되는 동안 사용자가보기를 변경할 수 없도록 UI를 고정 시키십시오. 아마도 이것은 최고의 아이디어는 아니지만 멈추기 위해 충돌을 얻는 것 같습니다 ... – jsetting32

+0

흠. weired. 내가 물어봐도, 당신은 또한 NSOperation에 논리를 포장하고 새로 만든 NSOperationQueue에 추가합니까? 그렇다면, 작업 큐는 눌려진 viewcontroller에만 존재합니까? 이것이 문제 일 수 있기 때문입니다.작업 대기열이 해제되기 전에 작업을 취소해야합니다. 나는 (그리고 나는 이것을 또한했다) 제안 할 것이고, UIApplicationDelegate 프로토콜의 구현에서 NSOperationQueue를 생성하는 것이다. viewcontroller는 데이터 만 표시하고 sendable 객체를 만듭니다. 이것은 내 트릭이며, 나는 그것이 당신을도 돕기를 바랍니다! – NicTesla

관련 문제