0

重複の可能性:
アプリがアクティブでない場合のiOSバックグラウンドダウンロード

アプリがバックグラウンドに入ったときに、iOSアプリのコードの一部を実行し続けたいのですが。

関数のシーケンスを実行する必要があるクラスがいくつかあります。すべての関数は、ASIHTTPRequestを使用してデータを非同期にロードします。アプリがバックグラウンドで実行されているときにこれらの関数を実行し続けたいのですが、最後のASIHTTPリクエストが完了したら、ローカル通知を表示する必要があります。

フォローコードのようなものがあります

- (void) start //call this method from another class
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setShouldContinueWhenAppEntersBackground:YES];
    [request setCompletionBlock:^{
        NSData *responseData = [request responseData];

        NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:responseData];
        [xmlParser setDelegate:self];
        [xmlParser parse];
        [xmlParser release];
    }];
    [request startAsynchronous];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    //parse xml
    if(all is Ok)
    {
        [self func1];
    }
}

- (void) func1
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setShouldContinueWhenAppEntersBackground:YES];
    [request setCompletionBlock:^{
        [self func2];
    }];
    [request startAsynchronous];
}

- (void) func2
{
    //like func1 
    ....
    [self func3];

}

- (void) func3
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setShouldContinueWhenAppEntersBackground:YES];
    [request setCompletionBlock:^{
        //Handling Local Notifications if app is in background
    }];
    [request startAsynchronous];
}

次のコードを使用してすべてのメソッドをラップしようとしましたが、アプリがバックグラウンドにある場合、最後のリクエスト関数は完了しませんでした。 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { ..func's scope.. }];

4

1 に答える 1

0

dispatch_asyncにbeginBackgroundTaskWithExpirationHandlerを使用する必要があります。そうしないと、アプリがバックグラウンドにあるときに実行されません。

于 2012-06-20T17:05:41.647 に答える