IOS, когда фоновая служба вызывает мое приложение, зависает

Ниже приведен код, который я использую для вызова 5 различных служб, чтобы получить ответ и сохранить его в моем текстовом файле json. Когда выполняется вызов фоновой службы, мое приложение зависает, событие касания не работает. после завершения вызова фоновой службы его работа. Я не хочу вешать свое приложение при вызове фоновой службы, как я могу это сделать.

[NSTimer scheduledTimerWithTimeInterval:60.0 target:self
                      selector:@selector(checkAlert) userInfo:nil repeats:YES];

person sairam    schedule 14.05.2015    source источник
comment
Используйте другой поток вместо основного для вызова фоновых служб. Основной поток отвечает за весь интерфейс пользовательского интерфейса и взаимодействие с пользователем. Так что не блокируйте свой основной поток.   -  person Vijay Masiwal    schedule 14.05.2015


Ответы (2)


вы можете использовать Grand Central Dispatch (GCD), в этом вы можете написать код для выполнения некоторой обработки в фоновом потоке, а затем сделать что-то с результатами в основном цикле выполнения невероятно просто и компактно:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   // Add code here to do background processing
   //
   //
dispatch_async( dispatch_get_main_queue(), ^{
    // Add code here to update the UI/send notifications based on the
    // results of the background processing
   });
});

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

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
   // call your method
});
person Shruti    schedule 14.05.2015
comment
... и отложенный тайминг? Не подскажете, как это достигается? - person trojanfoe; 14.05.2015
comment
developer.apple.com/library/prerelease/ios/documentation/.... если вы хотите добавить задержку... используйте dispatch_after - person Shruti; 14.05.2015
comment
Я думаю, что было бы полезно добавить к вашему ответу. - person trojanfoe; 14.05.2015
comment
// Задержка выполнения моего блока на 10 секунд. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ // вызов вашего метода }); его вызов, но та же проблема, пользовательский интерфейс зависает - person sairam; 14.05.2015
comment
можно попробовать увеличить задержку и проверить - person Shruti; 14.05.2015
comment
@SairamGogikar .. я рад, что это помогло :) .. пожалуйста, примите ответ, если он вам помог. - person Shruti; 14.05.2015
comment
какие сомнения? подскажите может я смогу помочь - person Shruti; 14.05.2015
comment
с моего контроллера представления панели инструментов я вызываю фоновую службу каждые 5 минут. И снова я иду к другому контроллеру представления оттуда, также я вызываю некоторые URL-адреса. Я хочу знать, запускаю ли я фоновую службу с панели управления. это влияет на то, когда я перехожу к другому контроллеру представления.bcz некоторые другие URL-адреса, которые я вызываю из этого контроллера представления. - person sairam; 14.05.2015
comment
да, я так думаю ... пока ваша панель управления не находится в стеке навигации, она будет запускать службы в фоновом режиме. - person Shruti; 14.05.2015
comment
есть ли возможность этого добиться. - person sairam; 14.05.2015
comment
Я думаю, вы можете приостановить эту операцию в viewDidDiappear.. проверьте эту ссылку для справки. -a-dispatch-queue" title="как остановить выполнение задач в очереди отправки"> stackoverflow.com/questions/6928752/ - person Shruti; 14.05.2015
comment
@SairamGogikar, добро пожаловать... :) - person Shruti; 14.05.2015

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

dispatch_async( dispatch_get_global_queue(0, 0), ^{
  [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(checkAlert) userInfo:nil repeats:YES];
});

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

person Vizllx    schedule 14.05.2015
comment
Используете GCD и NSTimer? Почему? Действительно ли этот код вызывает checkAlert в фоновом потоке? - person trojanfoe; 14.05.2015
comment
не могли бы вы прислать мне, пожалуйста, пример GCD - person sairam; 14.05.2015
comment
@Sairam Gogikar, если у вас есть какие-либо проблемы с этим, напишите здесь, в противном случае я недоступен для каких-либо других разъяснений другим пользователям. - person Vizllx; 14.05.2015
comment
@SairamGogikar Вы можете проверить эту ссылку для разъяснения GCD stackoverflow.com/questions/13079963/ - person Vizllx; 14.05.2015
comment
[NSTimer ScheduleTimerWithTimeInterva этот код в контроллере представления панели управления он будет вызывать каждую минуту, но когда я перейду к другому контроллеру представления в этом контроллере представления, я вызываю другие службы, это повлияет на эти службы - person sairam; 14.05.2015
comment
Если ваш контроллер представления панели инструментов работает в приложении, я имею в виду, что до тех пор, пока он не будет извлечен из стека навигации, он будет продолжать вызывать метод в фоновом режиме. - person Vizllx; 14.05.2015
comment
но некоторое время не вызывает метод (checkAlert) - person sairam; 14.05.2015