1

SQL データベースと同期するルーチンがあるアプリがあります。Wi-Fi アクセスが悪いと思われる問題がいくつかあります。

ルーチンは次のように機能します。

1 - UIButton が押されました

2 - インターネット接続が確認され、接続がある場合は ....

3 - 新しいスレッドが開始され、「読み込み中」のアニメーション GIF が表示されます

4 - 次のページが読み込まれます。

if([self connectedToInternet] == YES)
{
[NSThread detachNewThreadSelector:@selector(loadAnimation) toTarget:self withObject:nil];

ObViewControllerAdminMenu *monitorMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"webObservations"];
monitorMenuViewController.modalTransitionStyle = IModalTransitionStyleCrossDissolve;
[self presentViewController:monitorMenuViewController animated:YES completion:nil];
}

次に、webObservations ページで viewDidLoad メソッドを使用して、SQL データベースへの接続を開始します。

私の質問は、同期プロセス中にインターネット接続が切断された場合、どうなるでしょうか? アプリが「タイムアウト」し、応答がないためにシャットダウンしたように見えます。

iPad が 5 秒間非アクティブ状態の後にこれを行うと言うのは正しいと思いますが、これは正しいですか? もしそうなら、それを回避する方法は何ですか?

それが役立つ場合は、同期コードのスニペットを以下に示します。

- (void)viewDidLoad
{
NSString *strURLClass = [NSString stringWithFormat:@"%@%@", @"http://www.website.co.uk/uploads/getiobserveinfo.php?schoolname=",obsSchoolName];
NSArray *observationsArrayClass = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:strURLClass]];
NSEnumerator *enumForObsClass = [observationsArrayClass objectEnumerator];

observationListFromSQL = [[NSMutableArray alloc]init];

id className, dateOfObs,  teacher, startTime;

while (className = [enumForObsClass nextObject])
{
[observationListFromSQL addObject:[NSDictionary dictionaryWithObjectsAndKeys:className, @"obsClassName", nil]];
}

クラッシュログから - 起動時にルーチンも実行されることに注意してください

日付/時刻: 2013-09-20 11:56:31.731 +0300 OS バージョン: iOS 6.1.3 (10B329) レポート バージョン: 104

例外の種類: 00000020 例外コード: 0x000000008badf00d 強調表示されたスレッド: 0

アプリケーション固有の情報: uk.co.website が時間内に起動できませんでした

経過した合計 CPU 時間 (秒): 2.080 (ユーザー 2.080、システム 0.000)、5% CPU 経過したアプリケーション CPU 時間 (秒): 0.312、1% CPU

4

2 に答える 2

1

エラー: アプリケーション固有の情報: uk.co.website が時間内に起動できませんでした

同期機能を使用してネットワーク リソースを取得することは避けてください。initWithContentsOfURL は、ネットワークから完全な URL をダウンロードした場合にのみ返されます。このメソッド呼び出しは、アプリケーションの開始をブロックします。

NSURLConnection などのリソースをダウンロードしたり、AFNetworking などのサードパーティ ライブラリを使用したりする非同期メソッドがあります。

于 2013-09-26T07:52:13.233 に答える
1

このエラー コード0x000000008badf00dは、アプリの UI がフリーズし、応答に時間がかかりすぎたため、アプリがクラッシュしたのではなく、iOS によって強制終了されたことを意味します。この行が犯人だと思います、

NSArray *observationsArrayClass = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:strURLClass]];

これはメイン スレッドで呼び出される同期メソッドであるため、ウォッチドッグ タイムアウトが発生してアプリが強制終了されるまで UI がフリーズします。

解決

メインスレッドがブロックされないように、非同期の WS 呼び出しを行います。これを実現するために GCD を使用できます。

- (void)doAsyncCall
{
    //you can use any string instead "com.mycompany.myqueue"
    dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);

    dispatch_async(backgroundQueue, ^{
        //Make WS call here.
        //Parse response and create datasource for your UI elements

        dispatch_async(dispatch_get_main_queue(), ^{
            // Pass the datasource to the UI and update.
        });    
    });
 }

それが役立つことを願っています!

于 2013-09-26T07:52:40.090 に答える