2014-06-24 4 views
0

저는 KVC와 Cocoa Scripting에 대해 읽었으며, 어떻게 속성을 사용할 수 있습니까? 모델 클래스를 염두에두고 있지만 요소/속성 데이터는 인터넷에서 가져와야합니다. 그러나 네트워크 호출이 느리고 오류가 발생하기 쉬운 반면 속성 및 KVC 디자인은 빠른 메모리 검색 (&)을 가정 한 것처럼 보입니다. 어떻게 화해시킬 수 있습니까?KVC는 속도와 오류를 어떻게 처리합니까?

속도면에서 우리는 "나사 조이기"라고 말하고 대기 아이콘을 게시합니까? (물론 우리는 기다리는 동안 UI가 멈추지 않도록 멀티 스레드를 유지해야합니다.)

속성이 항상 사용 가능하다고 가정되는 경우 리소스 호출에 오류가 발생하면 nil으로 설정할 수 있습니다 . 그러나 우리는 세부 사항을 얻을 방법이 없을 것입니다. 더 나쁜 것은 "누락 된 값"을 지원하는 속성 일 것이고 nil은이를 나타낼 것이며 우리는 오류에 사용할 예비 상태가 없을 것입니다.

Apple 이벤트는 오류 처리를 지원하지만 잠재적으로 오류를 발생시키는 모델 호출과 Apple 이벤트 사이에서 KVC 레이어가 오류를 바닥에 떨어 뜨리기 때문에 사용할 수 없습니다. 디자이너는 오류 처리를위한 비밀 프로토콜을 추가했기 때문에 Scripting Bridge API에이 문제가 발생했습니다.

내가 틀렸어? KVC 기반 설계에서 오류를 처리 할 수있는 방법이 있습니까?

부록

나는 예외를 언급하는 것을 잊었다. Objective-C는 이제 그것들을 지원하지만, 나는 그것에 대해 읽은 조금이라도 C++에서와 같이 일반적인 에러 핸들링이 아니라 "똑바로 부서지는 대신에"파국적 인 용도로 사용된다는 것을 의미합니다. 그것을 제외하고, 그들은 여기에서 유용 할 수 있었다. ...

+0

당신이 무엇을 요구하고 있는지 명확하지 않습니다. KVC와 네트워킹의 관계는 무엇입니까? – Dima

+0

KVC는 객체에 대한 메소드를 호출하는 방법 일뿐입니다. 모델 객체에만 국한된 것이 아니므로 어디에서나 동일한 방법으로 오류와 네트워킹을 처리 할 수 ​​있습니다. KVO는 재미있는 키프 (keypath) 등으로 구성됩니다. – stevesliva

+0

특정 유형의 서명이있는 메소드입니다. – stevesliva

답변

0

나는 당신이 지금 무엇을 묻고 있는지에 관해 안다고 생각한다. 나는 KVC (또는 재산 취득자)를 사용하는 것이 당신이하고자하는 것을 성취하는 좋은 방법이 아니라고 말할 것입니다. 코드가 주 스레드에서 호출되면 해당 스레드를 차단합니다. 너는하고 싶지 않아. 오류와 같은 다른 상태 정보를 반환하는 데 어려움을 겪게된다는 것을 알았습니다.

대신 블록 구문을 사용하여 백그라운드 큐에서 작동하는 비동기 메서드를 만들어야합니다. 당신이 원하는대로 이것은 또한 당신에게 당신이 원하는뿐만 아니라 많은 값으로 반환되어 다른 많은 매개 변수를 전달 할 수있는 이점을 제공

// called from main thread 
- (void) fetchDataInBackgroundWithCompletionHandler:(void (^)(id responseData, NSError *error))handler 
{ 
    // perform in background 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() 
        { 
         // perform your background operation here 

         // call completion block on main thread 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          if(// whatever your error case is) 
          { 
           handler(nil, error); 
          } 
          else // success 
          { 
           handler(responseData, nil); 
          } 

         }); 
        }); 
} 

: 여기이 어떻게 보이는지에 대한 기본 템플릿입니다 완료 블록.

이 패턴의 아주 좋은 예는 iOS 용으로 많이 쓰이는 네트워킹 라이브러리 중 하나 인 AFNetworking입니다. 라이브러리의 모든 호출은 기본 대기열에서 수행 할 수 있으며 백그라운드에서 모든 네트워킹을 수행하는 동안 주 대기열에서 순식간에 돌아옵니다.

관련 문제