0

서버에서 데이터를로드하고 비동기 적으로 응답을 처리하고 있습니다. NSURLConnection 사용. delegate에 대한 각 호출 인 connection : didReceiveData :가 해당 청크를 처리 중입니다.비동기 처리 중 도면 일시 중단 NSURLConnection 수신 데이터

그러나 큰 데이터 덩어리가 수신되기 직전에 새로운 줄, 즉 [textView scrollRangeToVisible :]로 스크롤하기 위해 텍스트보기를 요청했습니다.

문제는 종종 모든 데이터가 수신 될 때까지 textView가 스크롤되지 않는다는 것입니다. 이것은 잠시있을 수 있으며 UI가 매달아 보이는 모양입니다.

문제를 해결하기 위해 주 스레드가 데이터 처리에 잠겨 있다고 생각하여 작은 조각으로 나누어야합니다.

그래서 내가 관련하여받은 데이터를 파괴하는 코드로 변경 : didReceiveData 작은 작업을 수행하고,이 runloop에 이벤트의 무리를두고 있다는 것을

[self performSelectorOnMainThread:withObject:smallerChunk waitUntilDone:FALSE] 

생각을 사용하여 대기열 및 가능한 경우 scrollRangeToVisible을 처리합니다.

그러나 이것은 작동하지 않습니다. 적어도 안정적이지는 않습니다. 내가 무엇이 누락 되었습니까?

답변

0

"그러나 이것은 작동하지 않습니다. 적어도 안정적으로는 안됩니다." 꽤 막연한 오류 설명입니다. 그러나 주 스레드를 차단하지 않도록 백그라운드 스레드에서 연결에서받은 데이터를 처리하는 것이 좋습니다.

당신은 예를 들어 직렬 파견 큐 만들 수 있습니다

:

dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL); 

connection:didReceiveData:에 그 큐에 데이터의 처리를 제출

dispatch_async(myQueue, ^{ 
    /* process data */ 
}); 
+0

는 적어도 안정적으로 때로는 얻을 않는 것을 의미하지 텍스트보기를 스크롤하는 것이지만, 종종 데이터 처리의 마지막 또는 끝 부분에 있습니다. 그것의 너무 느린 유용하지. 나는 당신의 접근 방식을 시도했고 효과가있었습니다. 내 관심사는 내가 수신 한 데이터로 Core Data 데이터베이스를 채우고 백그라운드 스레드에서 액세스하는 것에 대해 걱정하고 있다는 것이 었습니다. 그러나이 프로세스 중에는 다른 스레드에서 액세스 할 수 없으므로 안전 할 수 있습니다. 코어 데이터 제한이 한 번에 하나의 스레드에서만 또는 한 스레드 기간에서만 MOC를 사용할 수 있다는 것을 상기하지 않습니다. – David

+0

@David : 제 제안이 당신을 도왔다는 소식을 듣게되어 기쁩니다. (답변을 수락하는 것을 잊지 마십시오.) - MOC가 다른 스레드에서 사용되는 방법에 대한 강력한 제한이 있습니다. 당신은 그 주제에 대한 많은 게시물을 여기에서 찾을 수 있습니다. 더 많은 도움이 필요하면 완전히 다른 주제이므로 새로운 질문을 시작하는 것이 좋습니다. –