2011-09-18 68 views
0

我一直在試圖從正在期間延遲 - (id)init實例;可能嗎?

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

在NSURL的變化完全改變了記錄的NSURL得到一個PDF,但應用程序有機會在這種變化採取行動前視圖被加載。有沒有通過簡單的代碼移動到

viewDidLoad 

部分推遲在URL中的變化的閱讀方式,還是我要徹底改變一切?這是我的 - (ID)init方法:

- (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

我已將這些問題標記爲管理員刪除。儘管蒂姆,但我會記住這一點。 – CodaFi

+0

是的,我知道..我是收到你的國旗的主持人。 (用戶名旁邊的♦表示用戶是主持人) –

回答

3

當你需要與網絡合作的行之有效的方法是使用異步調用。這是因爲網絡連接的性質;它是不可預測的,並不總是可靠的,你需要花費時間從服務器獲取結果的時間可能從毫秒到分鐘不等。

我會做一個數據模型類,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]; 
} 

同時出現的用戶界面顯示活動的指標。

的MyPDFModelDelegate協議應該有兩種方法:

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

YourPDFWrapperClass用於返回一個autoreleased文檔。

委託可以讓UI知道數據已更新,例如,如果委託是數據模型的一部分,則發佈通知。

這只是一個例子,實現可以根據您的需要而有所不同,但我認爲您會明白。

P.S.延遲初始化是一個非常糟糕的主意。

+0

感謝帖子......但我沒有使用服務器,也沒有希望在我的新手級別。所有資源都是本地的,所以我的問題是初始化時間。 – CodaFi

+0

不客氣。如果文件位於本地存儲的服務器上,則無關緊要。如果您在計時方面存在問題,則無論延遲的原因如何,異步方法都適用。 – Davyd

+0

Davyd,你是救星!注意這件事,這將是我的第一個應用程序! – CodaFi