目前我正在从 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。锁被释放,一切看起来都很好。我试图在单独的 NSThread 中发送产品请求,使用 NSOperationQueue...无济于事。
- 为什么 ?怎么了 ?
- 如何解决问题?