2011-12-14 11 views
2

私のアプリケーションデリゲートは、バックグラウンドに入ったり終了したりするときに、Microsoft SQLデータベースの注文書のロックを解除/ロックする必要があります。iPhone willResignActiveメソッドは実行を完了しません

はここに私のコード

- (void)applicationWillResignActive:(UIApplication *)application { 

    NSLog(@"App will enter background"); 
    if ([purchaseOrderIsLocked boolValue] && [purchaseOrderAutoID intValue] > 0) { 
     NSLog(@"Unlock Purchase Order because app is in background %i", [purchaseOrderAutoID intValue]); 
     [self unlockPurchaseOrderWithAutoID:self.purchaseOrderAutoID]; 
    } 

- (void)applicationWillEnterForeground:(UIApplication *)application { 

    NSLog(@"App will enter foreground"); 

    if ([purchaseOrderIsLocked boolValue] == FALSE && [purchaseOrderAutoID intValue] > 0) { 
     NSLog(@"Lock Purchase Order because app is coming back %i", [purchaseOrderAutoID intValue]); 
     [self lockPurchaseOrderWithAutoID:self.purchaseOrderAutoID]; 
    } 
} 

-(void)lockPurchaseOrderWithAutoID:(NSNumber *)autoID { 

NSLog(@"lock purchase order called with autoID=%i",[autoID intValue]); 

    self.client = [SqlClientConnect connect]; 
    [self.client executeQuery:[NSString stringWithFormat:@"UPDATE PURCHASE SET PURCHASELOCK = '9999' WHERE PURCHASEORDERNO = '%i'", [autoID intValue]] 
      withCompletionBlock:^(SqlClientQuery *query) { 

       if (query.succeeded) { 
        NSLog(@"locked purchase order"); 
        purchaseOrderIsLocked = [NSNumber numberWithBool:YES]; 
       } else { 
        [self queryFailedWithError:query.errorText]; 
       } 
      }]; 
} 

-(void)unlockPurchaseOrderWithAutoID:(NSNumber *)autoID { 
    NSLog(@"unlock purchase order called with autoID=%i",[autoID intValue]); 

    self.client = [SqlClientConnect connect]; 
    [self.client executeQuery:[NSString stringWithFormat:@"UPDATE PURCHASE SET PURCHASELOCK = '0' WHERE PURCHASEORDERNO = '%i'", [autoID intValue]] 
      withCompletionBlock:^(SqlClientQuery *query) { 

       if (query.succeeded) { 
        NSLog(@"unlocked purchase order"); 
        purchaseOrderIsLocked = [NSNumber numberWithBool:FALSE]; 
       } else { 
        [self queryFailedWithError:query.errorText]; 
       } 
      }]; 
    } 

} 

オーケーだ、それは私がアプリを実行したときしかし、これは私がホームボタン

2011-12-14 13:41:20.558 MA Mobile[2267:707] App will enter background 
    2011-12-14 13:41:20.558 MA Mobile[2267:707] Unlock Purchase Order 
    because app is in background 18 

2011-12-14 13:41:20.559 MA Mobile[2267:707] unlock purchase order called with autoID=18 

を押したときに、私は、ログから得るものです...私にはよさそうですそれはすべての方法を行って、 "ロックされていない注文書"を投稿している必要がありますが、それは 私は何を得るのですか?

2011-12-14 13:41:44.741 MAモバイル[2267:707]:41:44.973 MAモバイル[2267:707]ロック解除された発注書

アプリケーションがフォアグラウンド 1 2011-12-14 13を入力します

再開後にブロックコードが実行されるようです。これはブロックに関連していますか?私は何か違うことをすべきでしょうか?

+0

てみてください。機能の終わりに。 – StackFlowed

答えて

7

ブロックを終了して-applicationDidResignActive:に戻ると、アプリはすぐに一時停止され、開始した非同期呼び出しは本質的に一時停止されます。 -beginBackgroundTaskWithExpirationHandler:を使用して、バックグラウンドでより多くの時間を費やす必要があることをアプリケーションに知らせる必要があります。以下の例のようなコードで実行できます。長時間実行されるバックグラウンドタスクの詳細については、iOS App Programming GuideのBackground Execution and Multitaskingを参照してください。

この単純な例では、あなたのコード内でこの機能を使用する方法を示しています。リターンを追加

-(void)unlockPurchaseOrderWithAutoID:(NSNumber *)autoID 
{ 
    NSLog(@"unlock purchase order called with autoID=%i",[autoID intValue]); 

    // Start long-running background task 
    UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 

    self.client = [SqlClientConnect connect]; 
    [self.client executeQuery:[NSString stringWithFormat:@"UPDATE PURCHASE SET PURCHASELOCK = '0' WHERE PURCHASEORDERNO = '%i'", [autoID intValue]] withCompletionBlock:^(SqlClientQuery *query) { 
    if (query.succeeded) { 
     NSLog(@"unlocked purchase order"); 
     purchaseOrderIsLocked = [NSNumber numberWithBool:FALSE]; 
    } else { 
     [self queryFailedWithError:query.errorText]; 
    } 
    // After we complete the asynchronous block, we need to let the system know we can suspend now 
    if(bti != UIBackgroundTaskInvalid) 
     [[UIApplication sharedApplication] endBackgroundTask:bti]; 
    }]; 
} 
+0

これは問題を解決しました...ただ1つの質問です。このメソッドは、バックグラウンドに入っていないときに呼び出されることがあります。 UIBackgroundTaskIdentifierを使用するのは大丈夫ですか? – Hackmodford

+0

はい、それは何も傷つけることはありません。また、それが本当にあなたが望むものかどうかを判断する必要があります。たとえば、現在、不均衡な通話があります。アプリがバックグラウンドに入るときだけロックを解除するには、そのメソッド '-applicationDidEnterBackgroun:'を使用する必要があります。ユーザーが自分の電話機などをロックするたびにロックを解除したいのであれば、使用しているメソッドは正常ですが、通常は-applicationDidBecomeActive:とバランスが取れています。 –

+0

このチップをありがとう。それは私の次の質問を解決した;) – Hackmodford

1

applicationWillResignActiveは非常に高速ですので、アプリケーションがフォアグラウンドを失う前にタスクが終了していない可能性があります。このメソッドは、類似の名前を持つ他のメソッドとは異なります。アプリケーションが辞任しても問題ないかどうかを尋ねるのではなく、アプリケーションが辞任していることを伝えています。

「Fininte Length Taskをバックグラウンドで実行する」のセクションについては、iOS Developer guideを参照して、余分な時間を要請する方法を確認してください。

1

applicationWillResignActiveは、あなたがアプリを利用できなくなったことを知らせる情報があります。コールが受信されたり、システムアラートがポップアップしたりするなど、ユーザーとのやりとりを受け取ることができません。

ユーザーがホームボタンを押したため、このメソッドが呼び出され、その後、アプリケーションが背景に入り、applicationDidEnterBackgroundが呼び出されるためです。これは、あなたが何をする必要があるか5秒しかないのに、このプロセスを実行したい場所です。しかし、iOS4では、バックグラウンドタスクを開始することで最大10分の時間を要求できます。

この方法の実装には、タスクを実行して戻るまでに約5秒かかります。最終的なタスクを実行するためにさらに時間が必要な場合は、beginBackgroundTaskWithExpirationHandler:を呼び出して、システムから追加の実行時間を要求できます。実際には、できるだけ早くapplicationDidEnterBackgroundから戻ってください。時間がなくなる前にメソッドが戻ってこない場合、アプリケーションは終了し、メモリからパージされます。

関連する問題