Задержка экземпляра - (id) init; Является ли это возможным? - PullRequest
0 голосов
/ 18 сентября 2011

Я пытался получить PDF от NSURL, который был изменен во время

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

. Изменения в NSURL регистрируются отлично, но представление загружается до того, как приложение сможет воздействовать наэто изменение.Можно ли отложить чтение изменения URL-адреса, просто переместив код в раздел

viewDidLoad

, или мне нужно все радикально изменить?Вот мой - (id) метод инициализации:

- (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 Ответ

3 голосов
/ 18 сентября 2011

Когда вам нужно работать с сетью, проверенный подход заключается в использовании асинхронных вызовов.Это из-за природы сетевого соединения;это непредсказуемо, не всегда надежно, время, которое вам нужно потратить, чтобы получить результат от сервера, может варьироваться от миллисекунды до минут.

Я бы сделал класс модели данных 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 используется для возврата автоматически выпущенного документа.

Делегат может сообщить пользовательскому интерфейсу, что данные были обновлены, например, отправив уведомление, если делегат является частью модели данных.,

Это всего лишь пример, реализация может отличаться в зависимости от ваших потребностей, но я думаю, вы поймете эту идею.

PS Задержка инициализации - очень плохая идея.

...