延迟 - (id)init实例;可能吗?

时间:2011-09-18 03:41:14

标签: objective-c ios cocoa-touch ipad nsurl

我一直在尝试从

期间更改的NSURL中获取PDF
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

NSURL中的更改完美记录,但视图在应用程序有机会对该更改执行操作之前加载。有没有办法通过简单地将代码移动到

来延迟读取URL的更改
viewDidLoad

部分,还是我必须彻底改变一切?这是我的 - (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;

}

1 个答案:

答案 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];
}

同时UI应显示活动指示器。

MyPDFModelDelegate协议应该有两种方法:

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

YourPDFWrapperClass用于返回自动释放的文档。

代理可以让UI知道数据已更新,例如,如果委托是数据模型的一部分,则通过发布通知。

这只是一个例子,根据您的需要,实施可能会有所不同,但我认为您会明白这一点。

P.S。延迟init是一个非常糟糕的主意。