2011-09-18 62 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