Скачать асинхронно

Я новичок в Objective C, и мне интересно, может ли кто-нибудь помочь мне (или указать мне учебник), чтобы загрузить файл.plist в мое приложение для iOS, а затем прочитать его, мне нужно, чтобы файл загружался асинхронно, чтобы он не приостановить приложение во время загрузки.

Текущий код, который я использую:

//UERootArray = [[NSArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"file to url"]];

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

4 ответа

Решение

Вы можете использовать NSURLConnection для достижения этой цели.

или же

Вы можете просто использовать GCD для этого, например:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   UERootArray = [[NSArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"file to url"]];
});

Попробуйте это для загрузки с дополнением.

 NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://"]];


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue]  completionHandler:^(NSURLResponse *response,NSData *data,NSError *error)
     {

    //do your stuff when downloading complete..
}

Если вы хотите знать, что ваше приложение завершило загрузку, и после этого вы хотите выполнить какое-то действие, то в этом случае вам нужно написать свой собственный делегат, который будет обновляться после завершения загрузки приложения. Но для асинхронной загрузки вы используете GCD, как упомянуто Midhun. См. Это Как написать пользовательский делегат?

Ниже приведен эскиз реализации с использованием NSURLConnection, Обратите внимание, что completionHandler будет вызван после завершения загрузки (либо с OK, либо с ошибкой), и вы можете вызвать функцию, которая обрабатывает Array оттуда.

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

NSURLRequest* theRequest = [NSURL URLWithString:@"file to url"];
[NSURLConnection sendAsynchronousRequest:theRequest
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse* theResponse, NSData* theData, NSError* theError) {
    if (theData) {
        NSError* err = nil;
        id Array [NSPropertyListSerialization propertyListWithData:theData 
                                                           options:NSPropertyListImmutable
                                                            format:NULL
                                                              error:&err];
        if ([Array isKindOfClass:[NSArray class]) {
            // Do whatever you need with downloaded array
        } else {
            // Error -- wrong data, check err
        }
    } else {
        // Error while downloading, check theError
    }
}];
Другие вопросы по тегам