0

現在、サポートされている製品をplistからロードしています。その後、SKProductsRequestを送信して、SKProductsが引き続き有効であることを保証します。

だから私はリクエストを設定し、それを開始し、次のように応答を取得します:

  • (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

これまでのところ、すべてが正しく機能しています。問題:リクエストの呼び出しからレスポンスの受信まで、数秒かかる場合があります。それまでは、アプリが既に読み込まれ、ユーザーが商品を選択して購入できる可能性があります。

ただし、受け取った製品がないため、利用可能な製品は検証済みの製品と同期していません->可能性は低いですが、エラーが発生する可能性があります。

したがって、私の考えは、データがロードされるまで待機し、リストが検証されたときにのみ続行することです。(ほんの数秒待っています...)。すべての製品を管理するシングルトンインスタンスがあります。

 + (MyClass *) sharedInstance
{
   if (!sharedInstance)
       sharedInstance = [MyClass new];
// Now wait until we have our data
    [condition lock];
    while (noEntriesYet)   // is yes at begin
       [condition wait];
    [condition unlock];
    return sharedInstance;
}

- productsRequest: didReceiveResponse:
{
[condition lock];

// I have my data

noEntriesYet = false;
[condition signal];
[condition unlock];
}

問題:アプリがフリーズします。sharedInstanceが照会される前にdidReceiveResponseが完了すると、すべてが正常に機能します。さまざまなスレッドがあり、didReceiveResponse中に待機に達するとロックが機能し、すべて正常に機能します。ただし、そうでない場合は、要求が送信されたとしても、didReceiveResponseが呼び出されることはありません。ロックが解除され、すべて問題ないように見えます。NSOperationQueueを使用して別のNSThreadで製品リクエストを送信しようとしましたが、役に立ちませんでした。

  • なんで ?何が起こっている ?
  • 問題を解決する方法は?
4

2 に答える 2

0

製品のロード中にGUIをブロックすると思います。この場合、ユーザーは何も変更できません。例:アプリストアでの作業中にアプリをブロックするために、透過ビュー+uiactivityindicatorを使用します。

于 2010-06-14T18:11:10.303 に答える
0

わかりました、これまでのところ問題があります:

通知は常にメインの実行ループで送信されるため、実行ループが停止しない場合があります。共有インスタンスメイン実行ループで初期化されるため、それを回避する方法はありません。

最終的に行ったこと:共有インスタンスに、製品リストがまだ到着しているかどうかを示すフラグを追加しました。製品を購入する前に、ロードされているかどうかを確認する必要があります。ロードされていない場合、UIAlertViewがポップアップし、製品リストがまだ検証されていないことを通知します。しばらくしてから再試行する必要があります。

それはうまくいきます。有効な製品のみを取得することを保証するために、製品情報は共有インスタンスからのみ取得できます。

于 2010-06-17T13:30:55.080 に答える