2011-09-18 5 views
0

나는 NSURL의 변화는 완벽하게 로깅하는- (id) init 인스턴스 지연; 그것은 가능한가?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

동안 변경되는 NSURL에서 PDF를 얻기 위해 노력했습니다,하지만 응용 프로그램은 그 변화에 따라 행동 할 수있는 기회를 가지고 전에보기로드됩니다. 단순히

viewDidLoad 

섹션에 코드를 이동하여 URL의 변화의 읽기를 지연하는 방법이 있습니까, 아니면 과감하게 모든 것을 변경해야합니까? 당신이 네트워크로 작업해야하는 경우

- (id)init { 
if (self = [super init]) { 
    CFURLRef pdfURL = (CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:appDelegate.baseURL ofType:@"pdf"]]; 
    pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); 
} 
return self; 

}

+0

질문을 변경해야하는 경우 수정하십시오.받은 답장을 작성한 사람에게 의견을 남겨두면 도움이됩니다. 해결해야 할 완전히 다른 문제가있는 것으로 판명되면 새로운 질문을하십시오. 이것을 새로운 질문에 인용하고 어떻게 다른지를 나타낼 수 있습니다. –

+0

나는이 질문을 관리자에 의한 삭제 표시했습니다. 어쨌든 Tim 선생님, 감사드립니다. – CodaFi

+0

예, 알고 있습니다 ... 저는 귀하의 국기를받은 사회자입니다. (사용자 이름 옆에있는 ♦는 사용자가 중재자임을 나타냅니다.) –

답변

3

이 입증 된 접근 방식은 비동기 호출을 사용하는 것입니다 (ID) 초기화 방법 - 여기 내입니다. 이는 네트워크 연결의 성격 때문입니다. 그것은 예측할 수없고, 항상 신뢰할 수있는 것은 아니며, 서버에서 결과를 얻기 위해 소비해야하는 시간은 밀리 초에서 수분으로 다양합니다.

나는 비동기 방법, 그 서버에서 파일을 얻기 위해 스레드를 실행해야합니다, 데이터 모델 클래스, MyPDFModel을 만들 것입니다 :

- (void)requestPDFWithURL:(NSURL*)fileURL 
{ 
    [NSThread detachNewThreadSelector:@selector(requestPDFWithURLThreaded:) toTarget:self fileURL]; 
} 

- (void)requestPDFWithURLThreaded:(NSURL*)fileURL 
{ 
    NSAutoreleasePool* pool = [NSAutoreleasePool new]; 
    // do whatever you need to get either the file or an error 
    if (isTheFileValid) 
     [_delegate performSelectorOnMainThread:@selector(requestDidGetPDF:) withObject:PDFFile waitUntilDone:NO]; 
    else 
     [_delegate performSelectorOnMainThread:@selector(requestDidFailWithError:) withObject:error waitUntilDone:NO]; 

    [pool release]; 
} 

는 한편 UI가 활동 표시를 표시해야합니다.

MyPDFModelDelegate 프로토콜은 두 가지 방법이 있어야합니다

- (void)requestDidGetPDF:(YourPDFWrapperClass*)PDFDocument; 
- (void)requestDidFailWithError:(NSError*)error; 

YourPDFWrapperClass는 오토 릴리즈 문서를 반환하는 데 사용됩니다.

대리인은 데이터가 업데이트되었음을 ​​UI에 알릴 수 있습니다. 예를 들어 대리자가 데이터 모델의 일부인 경우 알림을 게시합니다.

이것은 단지 예일 뿐이며 구현은 필요에 따라 다를 수 있지만 생각을하게 될 것입니다.

P. init을 지연하는 것은 매우 나쁜 생각입니다.

+0

게시물을 보내 주셔서 감사합니다 ...하지만 서버를 사용하지 않고 있으며 초보자 수준까지는 기대하지 않습니다. 모든 리소스는 로컬이므로 내 문제는 초기화 타이밍입니다. – CodaFi

+0

당신은 오신 것을 환영합니다. 파일이 로컬에 저장된 서버에 있는지 여부는 중요하지 않습니다. 타이밍에 문제가있는 경우 지연 이유와 관계없이 비동기 방식을 적용 할 수 있습니다. – Davyd

+0

Davyd, 당신은 생명의 은인입니다! 이 일을위한 경계에 있으십시오, 그것은 나의 첫번째 app 일 것이다! – CodaFi

관련 문제