現在、サポートされている製品を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で製品リクエストを送信しようとしましたが、役に立ちませんでした。
- なんで ?何が起こっている ?
- 問題を解決する方法は?