2012-03-01 6 views
3

私はSamのTeach Yourself iPhone devを見ていますが、backgroundingの例はわかりません。非バックグラウンド化コードは次のとおりです。beginBackgrounTaskWithExpirationHandlerを使用してバックグラウンドで実行するものを選択的に指定する方法:

- (void)viewDidLoad { 
     [super viewDidLoad]; 
     count=0; 
     theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
         target:self 
         selector:@selector(countUp) 
         userInfo:nil 
         repeats:YES]; 
    } 

そしてバックグラウンド化バージョンは次のとおりです。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    counterTask = [[UIApplication sharedApplication] 
       beginBackgroundTaskWithExpirationHandler:^{ 
       // If you're worried about exceeding 10 minutes, handle it here 
       }]; 
    count=0; 
    theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
        target:self 
        selector:@selector(countUp) 
        userInfo:nil 
        repeats:YES]; 
} 

私は理解していない何の関連が背景とbeginBackgroundTaskWithExpirationHandlerで実行されるアクティビティ間にある場所です。

NSTimerがバックグラウンドで実行されている。この例では - しかし、どのようないくつかの他のアクティビティがあった場合、すなわちだけでなく、バ​​ックグラウンドで実行されることはコードがあるとします

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    counterTask = [[UIApplication sharedApplication] 
       beginBackgroundTaskWithExpirationHandler:^{ 
       // If you're worried about exceeding 10 minutes, handle it here 
       }]; 
    count=0; 
    theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
        target:self 
        selector:@selector(countUp) 
        userInfo:nil 
        repeats:YES]; 

    x: some other activity to be performed in the background 
    maybe another timer with a difference time interval 
} 

あなたはさらに指定することができますどのようにそのxもバックグラウンドで実行されますか?

また、どのように動作しているのか誤解していますか?beginBackgrounTaskWithExpirationHandlerが呼び出されると、実際にバックグラウンドで実行されるアプリケーション全体です。その場合、アプリであるタスクを1つしか起動できないため、タスク識別子が必要なのはなぜですか?

これが当てはまらず、さまざまなタスクを選択してバックグラウンドで実行することが可能な場合、これはどのように実装されていますか?この例では、Xが別の間隔と異なる期限切れ条件を持つ第2のタイマーであると仮定しますが、TheTimerとxの両方をバックグラウンドで実行したければ、コードはどのように見えますか? theTimerとtheTimer2の両方がバックグラウンドで実行するように指定する方法を

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    counterTask = [[UIApplication sharedApplication] 
       beginBackgroundTaskWithExpirationHandler:^{ 
       // If you're worried about exceeding 10 minutes, handle it here 
       }]; 
    count=0; 
    theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
        target:self 
        selector:@selector(countUp) 
        userInfo:nil 
        repeats:YES]; 

    theTimer2=[NSTimer scheduledTimerWithTimeInterval:1.0 
        target:self 
        selector:@selector(aDifferentMethod) 
        userInfo:nil 
        repeats:YES]; 

    theTimer3=[NSTimer scheduledTimerWithTimeInterval:10.0 
        target:self 
        selector:@selector(anotherDifferentMethod) 
        userInfo:nil 
        repeats:YES]; 

} 

しかしtheTimer3はしていません。つまり、コードはこのだったらどう?

答えて

1

または私はそれが動作してbeginBackgrounTaskWithExpirationHandlerが呼び出されたときに、それは実際にはバックグラウンドで実行されますwhcihアプリケーション全体でどのように誤解がありますか?その場合、アプリであるタスクを1つしか起動できないため、タスク識別子が必要なのはなぜですか?

アプリケーション全体が実行されます。何をするか決めるのはあなた次第です。 beginBackgroundTaskWithExpirationHandler:のポイントは、あなたがやるべき長期的なことがあることをシステムに伝えることです。それはメモを作って、あなたにトークンを戻します。長時間実行しているタスクが終了すると、そのトークンでendBackgroundTask:と呼ばれます。その間、あなたは実際にバックグラウンドに入ったことはない可能性があります。

アプリケーションが中断されると、保留中のトークンがあるかどうかが調べられます。あなたがしなければ、あなたを中断させます。あなたがそうした場合、あなたはしばらくの間あなたを走らせることができます。システムは、これらのトークンをどのように職場に関連付けるか気にしません。あなたはあなたのプログラム全体に対してただ一つのトークンを使うことができます。または、各オブジェクトは何かをする必要があるときに独自のトークンを保持することができます。要点は、トークンが1つであれば、一時停止する前に作業に余裕を持たせることです。

タイマーに関するご質問は、通常、バックグラウンドでタイマー作業を行うべきではありません。あなたには多くの時間がありません(最大10分)。あなたは仕事をして出かける必要があります。バックグラウンドに入るときには、タイマーをすべて一時停止(無効化)する必要があります。その後、再開するときにバックアップを設定します。

1

基本的にbeginBackgroundTaskWithExpirationHandlerは、アプリケーションがバックグラウンドに移行する前に長い実行中のタスクを実行するために使用されます。このハンドルを使用して、アプリケーションがバックグラウンドになる前にクリーンアップする必要があります。

counterTask = [のUIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^ { //このブロックで書かれたコードは、アプリケーションがバックグラウンド に進む前に実行されます}]。

時間が経過する前にタスクごとにendBackgroundTaskを呼び出さないと、OSによってアプリケーションが強制終了されます。

今、特定の時間間隔で、バックグラウンドでのコードの一部を実行するために、あなたは

[のUIApplication sharedApplication] setKeepAliveTimeout使用することができます:600ハンドラ:^ { //コードのこの作品は、ANで実行されますアプリケーションがバックグラウンドに移行したときの600秒の間隔 }];

上記のコードをapplicationWillResignActiveに書き込み、アプリケーションがフォアグラウンドになると、 [[UIApplication sharedApplication] clearKeepAliveTimeout];

これをapplicationDidBecomeActiveで呼び出します。

アプリケーションがバックグラウンドになると、setKeepAliveTimeoutで記述されたコード以外のコードは実行されません。

関連する問題