Статьи

iOS 7 SDK: работа с фоновой выборкой

Из этого туториала вы узнаете, как использовать Background Fetch, API многозадачности, поставляемый с iOS 7 SDK. Для этого мы создадим простой список вкусных блюд, которые автоматически выбираются в фоновом режиме. Читай дальше!


Background Fetch — потрясающая функция, выпущенная в iOS 7. Сегодня мы живем в социальном мире, и у большинства наших пользователей на мобильных устройствах есть несколько приложений для социальных сетей. Однако каждый раз, когда пользователь открывает каждое приложение, ему обычно приходится ждать обновления приложения для просмотра более свежего контента. Это может быть болезненно, если используется несколько приложений и профилей. Теперь, с помощью фоновой выборки, весь контент может автоматически выбираться и обновляться до того, как пользователь загрузит приложение.

Приложение Traffic по умолчанию является простым примером того, как Background Fetch работает в действии. Если вы проверяете это каждое утро, скажем, в 8:20, ваше iOS-приложение должно получить эту информацию в это время. Теперь, если операционная система знает, что вы получите доступ к приложению около 8:20 утра, она может забрать данные заранее и подготовить их при желании.

Для более полного обзора новых функций многозадачности обязательно прочитайте наше введение в эту тему . Остальная часть этого урока будет посвящена практическому проекту, который демонстрирует, как реализовать Background Fetch.

Первый шаг — создать проект iOS 7 и выбрать приложение с одним представлением. Далее давайте добавим некоторые свойства, которые будут полезны в этом уроке:

1
2
3
4
@property (nonatomic) NSMutableArray *objects;
@property (nonatomic) NSArray *possibleTableData;
@property (nonatomic) int numberOfnewPosts;
@property (nonatomic) UIRefreshControl *refreshControl;

Объекты NSMutablearray будут использоваться для сохранения объектов, перечисленных в TableView. Обратите внимание, что в этом руководстве вы не будете вызывать какие-либо службы для получения данных. Вместо этого вы будете использовать массив possibleTableData таблиц и случайным образом выбирать из него несколько объектов. Тем не менее, приложение может быть легко улучшено для получения данных с сервера, если хотите.

Целое число numberOfnewPosts представляет новые сообщения, которые доступны каждый раз, когда вы numberOfnewPosts запрос или получаете фоновую выборку. refrestControl — это элемент управления, который используется при обновлении задач. Поскольку это выходит за рамки учебного контекста, мы не будем его освещать. Тем не менее, вы должны посмотреть этот учебник Mobiletuts +, если вы хотите узнать больше.

В Main.storyboard измените ViewController на UITableViewController . Затем щелкните UITableViewController и перейдите в « Редактор»> «Встроить»> «Контроллер навигации» . Не забудьте установить пользовательский класс на ViewController .

Теперь перейдите к ViewController.m . Первый шаг — загрузить некоторые данные. Следующий код выделит и создаст объект данных, создаст заголовок и инициализирует refreshControl:

1
2
3
4
5
6
7
8
self.possibleTableData = [NSArray arrayWithObjects:@»Spicy garlic Lime Chicken»,@»Apple Crisp II»,@»Eggplant Parmesan II»,@»Pumpkin Ginger Cupcakes»,@»Easy Lasagna», @»Puttanesca», @»Alfredo Sauce», nil];
 
self.navigationItem.title = @»Delicious Dishes»;
 
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(insertNewObject:) forControlEvents:UIControlEventValueChanged];
 
[self.tableView addSubview:self.refreshControl];

Приведенный выше код сгенерирует предупреждение, поскольку метод insertNewObject отсутствует. Давайте решим это!

Метод сгенерирует случайное число и получит точно такое же количество объектов из массива данных. Затем он обновит табличное представление с новыми значениями.

01
02
03
04
05
06
07
08
09
10
11
12
— (void)insertNewObject:(id)sender
{
    self.numberOfnewPosts = [self getRandomNumberBetween:0 to:4];
    NSLog(@»%d new fetched objects»,self.numberOfnewPosts);
     
    for(int i = 0; i < self.numberOfnewPosts; i++){
        int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)];
        [self insertObject:[self.possibleTableData objectAtIndex:addPost]];
    }
    [self.refreshControl endRefreshing];
     
}

Предупреждение getRandomNumberBetween будет подавлено при добавлении следующего метода:

1
2
3
-(int)getRandomNumberBetween:(int)from to:(int)to {
    return (int)from + arc4random() % (to-from+1);
}

Чтобы загрузить объекты в объект NSArray , нам нужно реализовать методы делегата TableView .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
— (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
 
— (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.objects.count;
}
 
 
— (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@»Cell» forIndexPath:indexPath];
     
    cell.textLabel.text = self.objects[indexPath.row];
     
    if(indexPath.row < self.numberOfnewPosts){
        cell.backgroundColor = [UIColor yellowColor];
    }
    else
        cell.backgroundColor = [UIColor whiteColor];
     
    return cell;
}

Довольно просто, правда? Если вы Run проект, у вас будет интерфейс, подобный следующему изображению:

Рисунок 1: После установки - TableView!

Теперь вы хотите создать функцию Background Fetch. Чтобы сделать фоновую выборку доступной, вам нужно перейти в « Проект»> «Возможности»> «Включить фоновые режимы» и затем выбрать «Фоновая выборка», как показано на следующем рисунке:

Рисунок 2: Фоновая загрузка включена!

Однако одного этого недостаточно. По умолчанию приложение никогда не будет вызывать фоновый API, поэтому вам необходимо добавить следующую строку в приложение -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions метод AppDelegate.m файле AppDelegate.m :

1
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

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

Теперь, когда ваше приложение уже знает, как инициировать фоновую выборку, давайте расскажем, что делать. Метод -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler поможет в этом. Этот метод вызывается каждый раз, когда выполняется фоновая выборка, и его следует включить в файл AppDelegate.m . Полная версия представлена ​​ниже:

01
02
03
04
05
06
07
08
09
10
11
12
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
     
    UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;
     
    id topViewController = navigationController.topViewController;
    if ([topViewController isKindOfClass:[ViewController class]]) {
        [(ViewController*)topViewController insertNewObjectForFetchWithCompletionHandler:completionHandler];
    } else {
        NSLog(@»Not the right class %@.», [topViewController class]);
        completionHandler(UIBackgroundFetchResultFailed);
    }
}

Затем вы также должны импортировать заголовочный файл AppDelegate.m класс AppDelegate.m .

1
#import «ViewController.h»

Обратите внимание, что insertNewObjectForFetchWithCompletionHandler еще не был создан. Итак, перейдите к ViewController.h и объявите его.

1
— (void)insertNewObjectForFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

Теперь сосредоточьтесь на файле реализации. Реализация очень похожа на добавленный ранее вызов insertNewObject . Тем не менее, мы используем completionHandler чтобы поговорить с системой и сообщить нам, если приложение получило новые данные, или если данные не были доступны.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
— (void)insertNewObjectForFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@»Update the tableview.»);
     
    self.numberOfnewPosts = [self getRandomNumberBetween:0 to:4];
    NSLog(@»%d new fetched objects»,self.numberOfnewPosts);
 
    for(int i = 0; i < self.numberOfnewPosts; i++){
        int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)];
        [self insertObject:[self.possibleTableData objectAtIndex:addPost]];
    }
    /*
     At the end of the fetch, invoke the completion handler.
     */
    completionHandler(UIBackgroundFetchResultNewData);
}

На этом этапе код должен быть завершен. Теперь давайте смоделируем тест и убедимся, что все работает!


Итак, если вы хотите убедиться, что все настроено, вам нужно отредактировать свои схемы . Перейдите к списку « Схемы» и нажмите « Управление схемами» , как показано на следующем рисунке:

Рисунок 3: Управление схемами!

В разделе «Управление схемами » вы можете продублировать схему вашего приложения:

Рисунок 4: Дублирующая схема!

После дублирования схемы появится новое окно. Вы можете изменить его имя на вкладке «Параметры» . Проверьте Launch из-за поля события фоновой выборки . Теперь просто нажмите Ok во всех окнах.

Рисунок 5: Фоновая схема выборки включена!

Далее запустите приложение, используя дублированную схему.

Обратите внимание, что приложение не будет открываться на переднем плане, но оно уже должно было извлечь некоторый контент. Если вы открываете приложение и несколько рецептов уже доступны, это значит, что вы добились успеха! Для принудительной выборки фона также можно использовать « Отладка»> «Симулировать выборку фона». из меню Xcode.


В конце этого урока вы должны понять механизм фоновой выборки и как реализовать его в своих собственных приложениях.

Если у вас есть какие-либо вопросы, пожалуйста, оставьте их в разделе комментариев ниже!