2013-03-27 2 views
1

내 iPhone에서 내 Mac으로 이미지를 성공적으로 보낼 수있는 프로그램을 만들었습니다. 이것이 송신을 마치 자마자 문제가되어 다른 데이터를 보내고 싶습니다 (정확히 무엇이 관련이 없는지). 내가 데이터를 보내려고 할 때마다, 나는 다음 줄에 의해 차단하고있다 : 어떤 스트림을 닫습니다, 또는 종류의 아무것도하지 않는CFWriteStreamCanAcceptBytes Blocking

if (!CFWriteStreamCanAcceptBytes((CFWriteStreamRef)_outputStream)) { 
    NSLog(@"FAILED ErrorCode:2 saveAsWallpaper in server.m"); 
    return; 
} 

. 문제가 다음 줄로있을 수 있다고 생각했습니다.

CFWriteStreamSetProperty(writeStream,kCFStreamPropertyShouldCloseNativeSocket, 
            kCFBooleanFalse); 

하지만 소켓이 닫히지 않아야합니다. 필요한 경우 더 많은 코드를 제공 할 수 있지만 솔루션보다 올바른 방향으로 더 많은 포인터가 필요합니다.

도움을 환영합니다. 감사합니다!

+0

차단 이유에 대한 추가 정보를 인쇄 할 수있는 방법이 있습니까? 예 : 종류의 NSE 오류? –

답변

0

그래서 ARC를 끄는 것이 어떻게 든 도움이되었습니다. 이와 같은 라인은 올바르게 작동하지 않습니다 (외모에서 수동 메모리 관리가 필요하기 때문에). "Retain"이라는 단어에 유의하십시오.

모두를위한 해결책은 아니지만 ARC를 끄고 누출을 관리하면 내 프로젝트에 모든 것이 잘 작동합니다.

+0

안녕하세요, 명확히하기 위해 CFWriteStreamCanAcceptBytes가 올바르게 작동 했나요?- ARC를 켠 채 통신 시작시 연결 확인을 추가했습니다. 통신 중에는 더 이상 확인하지 않습니다. – user387184

+0

user387184, 예. ARC가 너무 일찍 버려야 할 필요가있는 어딘가의 대상이 있었음에 틀림 없습니다. 내 자신의 기억을 관리하는 것이 도움이되었지만 지금은 기억을 관리하는 방법을 배워야 만합니다! –

+0

나는 ARC없이 이제 시도했다. CFWriteStreamCanAcceptBytes가 writeStream을 전달하는 특별한 통신 클래스 만 만들었다. – user387184

1

새로운 iPhone5에서 해당 메서드를 사용하면 버그 (또는 적어도 불일치)가있는 것으로 보입니다. 매우 동일한 CFWriteStreamCanAcceptBytes는 iPhone 3GS에서는 완벽하게 작동하지만 iPhone5에서는 완벽하게 작동하지 않습니다.

지금까지 찾은 유일한 해결책은 CFWriteStreamCanAcceptBytes을 더 이상 사용하지 않고 그냥 쓰는 것입니다. 제대로 작동합니다.

유일한 문제는 연결이 끊어지면서 어쨌든 작성하면 시간 초과에 약 20-30 초가 걸린다는 것입니다.

performSelectorInBackground을 사용하여 다른 작업에서 쓰기를 수행하고 반환하는 데 너무 오래 걸리는지 확인하려면 연결이 끊어 졌는지 확인하고 사용할 수있는 자신의 플래그를 설정하십시오 후속 호출을 위해 게이트 키퍼로 사용됩니다.

하지만 99 %의 경우 연결이 정상이므로 정상적으로 작동합니다.

많은 대안을 시도했지만 시작한 후에 write 실행을 중지 할 방법이 없습니다. 따라서 이것이 performSelectorInBackground을 사용한 이유입니다.

5 초 후에 실행해야하는 타이머조차도 성공하지 못한 쓰기는 시간이 걸리고 전혀 중단되지 않으므로 대기해야합니다.

+0

아, 답변에 감사 드리며 나중에 고려해야 할 사항입니다.하지만 iPhone 4에서 작업하고 있습니다. 다른 모델에도 영향을 미칠지 몰랐습니다. 흥미 롭습니다. 좋은 대답을위한 포인트, 친절하게 감사합니다. –

+0

또한 CFWriteStreamCanAcceptBytes를 사용하지 않으려 고했지만 대신 쓰기 스트림은 0을 반환합니다. 이는 설명서에 따라 스트림이 용량 (고정 길이 스트림 용)으로 채워진 경우 "0을 의미합니다. –