目前我正在从plist加载我支持的产品,然后发送SKProductsRequest以保证我的SKProducts仍然有效。
所以我设置了请求,启动它并获得响应:
现在,到目前为止所有功能都正确。 问题:从调用请求到收到响应,它可能会持续几秒钟。直到我的应用程序已经加载并且用户可以选择并购买产品。
但由于未收到任何产品,因此可用产品与经过验证的产品不同步 - >不太可能,但可能是错误。
所以我的想法是等到数据加载完毕并且只在验证列表时才继续。 (等待几秒钟......)我有一个管理所有产品的单例实例。
+ (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];
}
问题:该应用程序冻结。如果didReceiveResponse之前完成,一切正常 查询sharedInstance。有不同的线程,如果锁定正在工作 在didReceiveResponse期间达到等待,一切都很好。但如果没有,didReceiveResponse 即使请求已发送,也从不调用。 锁被释放,一切看起来都不错。我试图在单独的NSThread中发送产品请求,使用NSOperationQueue ...无济于事。
答案 0 :(得分:0)
我认为你会在产品加载过程中阻止你的GUI。在这种情况下,用户无法更改任何内容。例如:在使用应用商店期间,我使用透明视图+ uiactivityindicator来阻止应用。
答案 1 :(得分:0)
好的,到目前为止我遇到了问题:
通知始终在主运行循环中发送,因此运行循环可能不会停止。 由于在主运行循环中初始化了共享实例 ,因此无法规避 它
我最终做了什么:我在共享实例中添加了一个标志,指示产品列表 已经到了。在您尝试购买产品之前,您必须询问它是否已加载, 否则会弹出UIAlertView并通知您产品列表尚未经过验证 你应该在不久之后再试一次。
有效;为了保证您只获得有效的产品,只能从共享实例中获取产品信息。