La création d'un fond continu thread dans iOS
J'ai une obligation de créer un processeur d'arrière-plan qui fonctionne uniquement lorsque l'Application est en mode actif. J'ai essayé de faire un skelton de ce que je suis en train de réaliser, mais pas en mesure de l'obtenir pour fonctionner.
Je veux que ce Processeur d'arrière-plan pour aller dormir lorsque l'application passe pour un inactif de la scène et de reprendre quand le soft est livré à un mode actif. J'ai fourni un squelette de ce que j'ai fait ci-dessous. Quelqu'un peut-il m'aider à résoudre ce problème.
AppDelegate.h
#import <Foundation/Foundation.h>
@class BackgroundProcessor;
@interface AppDelegate_iPhone : UIResponder<UIApplicationDelegate>{
BackgroundProcessor* processor;
}
@property(nonatomic) BackgroundProcessor *processor;
@end
AppDelegate.m
#import "AppDelegate_iPhone.h"
#import "BackgroundProcessor.h"
@implementation AppDelegate_iPhone
@synthesize processor;
-(BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
processor = [[BackgroundProcessor alloc]init];
[processor Start];
return YES;
}
-(void) applicationDidEnterBackground:(UIApplication *)application
{
[processor Sleep];
NSLog(@"Entered Background");
}
-(void) applicationDidBecomeActive:(UIApplication *)application
{
[processor Resume];
NSLog(@"Became Active");
}
@end
BackgroundProcessor.h
#import <Foundation/Foundation.h>
@interface BackgroundProcessor : NSObject
{
NSThread* processor;
}
@property (nonatomic) NSThread *processor;
-(void) Start;
-(void) Sleep;
-(void) workloop;
-(void) Resume;
@end
BackgroundProcessor.m
#import "BackgroundProcessor.h"
@implementation BackgroundProcessor
@synthesize processor;
-(id) init
{
self = [super init];
if(self)
{
processor = [[NSThread alloc] initWithTarget:self selector:@selector(workloop) object:nil];
}
return self;
}
-(void) Start
{
if(processor)
[processor start];
}
-(void) Sleep
{
// [processor
[NSThread sleepForTimeInterval: 0.1];
}
-(void) workloop
{
NSLog(@"Background Processor Processing ....");
[NSThread sleepForTimeInterval:0.1];
}
- (void) Resume
{
NSLog(@"Background Resuming ....");
[NSThread sleepForTimeInterval: 0.1];
}
Je ne suis pas en mesure d'obtenir la workloop pour le remettre en marche continuellement.
Reconnaissant si quelqu'un pouvait m'aider à résoudre pourquoi le fond
Essayé cette après avis de Joshua Smith
#import "BackgroundProcessor.h"
@implementation BackgroundProcessor
-(id) init
{
self = [super init];
if(self)
{
queue = [[NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(workloop) object:nil];
[queue addOperation:operation];
}
return self;
}
-(void) workloop
{
NSLog(@"Sleeping for 10 seconds");
sleep(10);
NSLog(@"Background Processor Processing ....");
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(workloop) object:nil];
[queue addOperation:operation];
}
@end
OriginalL'auteur Abishek | 2012-06-25
Vous devez vous connecter pour publier un commentaire.
Moins qu'il existe une raison particulière à cela doit être un discret fil, je vous recommande d'utiliser un PGCD ou un NSOperation File d'attente et de produire et de consommer des travailleurs. Ce genre de long-thread en cours d'exécution va être un réel problème dans une application iOS.
PGCD tutoriel:
http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial
En gros, je veux lancer un thread qui effectue la vérification de la DB périodiquement pour envoyer des données à partir de mon application sur le serveur. Que voulez-vous recommander un endroit idéal pour faire quelque chose comme cela. Est-il un article de code ou quelque chose que je peux consulter, pour avoir une solution de contournement au lieu de frai mon propre fils? Et cette opération doit se produire uniquement lorsque l'application est sur le premier plan ou dans le mode Actif.
developer.apple.com/library/mac/#documentation/Cocoa/Reference/... est le meilleur endroit pour commencer. Ce que vous voulez faire, à un niveau élevé, est de placer l'emploi dans la file d'attente (pour vérifier la DB) et remplir la file d'attente lorsqu'il commence à exécuter des opérations. vous pouvez faire la même chose avec PGCD.
J'aime l'approche que vous avez suggéré, pour garder re-remplissage de la file d'attente avec les opérations. Est-il des problèmes de performances lorsque l'on fait cela? Quel est le nombre d'opérations suggérez-vous pour le remplissage de tous les temps?
Il n'y a pas de problèmes de performances spécifiquement avec ce, et le nombre d'opérations à utiliser dépend de la vitesse à laquelle ils sont utilisés, la quantité de mémoire qu'ils prennent, etc. L'optimisation de la file d'attente se remplit comme cela peut prendre quelques réglages (c'est un problème difficile).
OriginalL'auteur Joshua Smith
J'ai mis en place un scénario similaire à ce que vous décrivez. La façon dont il fut mis en œuvre pour avoir un timer en cours d'exécution sur un thread d'arrière-plan.
Donc, fondamentalement, lorsque l'application est lancée je commence une répétition de minuterie asynchrone, puis d'appeler mon GetNotifications méthode sur mon noticiationCenter classe.
OriginalL'auteur Craig Mellon
Par défaut, tous les processus s'arrêtera lorsque vous entrez dans le fond. Il y a seulement quelques différents processus qui peut être fait dans l'arrière-plan. Même si vous créez un nouveau fil de discussion, il sera toujours cesser lorsque vous entrez dans le fond.
Ensuite, l'application doit automatiquement se produire, si vous voulez vous assurer que vous pourrait libérer le processeur d'arrière-plan lorsque vous entrez dans le fond et lorsque la demande est de nouveau actif, vous pouvez réinitialiser l'objet
OriginalL'auteur mlindy92
De votre commentaire
Je dirais que vous êtes à l'aide de l'Approche Erronée ici. Juste à déclencher une opération asynchrone à intervalles réguliers lorsque l'application est au premier plan pour mettre à jour le serveur. À l'aide d'une longue durée de vie thread d'arrière-plan est simplement faux pour ce cas d'utilisation.
OriginalL'auteur uvesten
OriginalL'auteur Felipe