目前我正在从plist加载支持的产品,然后发送SKProductsRequest以确保我的SK产品仍然可用有效。在iphone上的应用程序购买:如何在有人可以购买前获得可用产品*
所以我设置的要求,启动它,并得到响应:
- (无效)productsRequest:(SKProductsRequest *)要求didReceiveResponse:(SKProductsResponse *)响应
现在,到目前为止所有功能正常。 问题:从调用请求直到收到响应,它可能会持续几秒钟。直到我的应用程序已经加载并且用户可能能够选择并购买产品。
但由于没有收到产品,可用产品与验证产品不同步 - >不太可能,但可能出现错误。
所以我的想法是等待数据加载,只有当列表被验证时才继续。 (等待几秒钟...)。我有一个管理所有产品的单例实例。
+ (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发送产品请求,但没有成功。
- 为什么?发生什么事 ?
- 如何解决问题?
由于GUI在主运行循环中工作,冻结的原因现在已知。不幸的是,我需要didReceiveResponse,并且消息在主线程上运行*,因此使用另一个线程初始化共享实例并阻止GUI直到我收到更复杂。在我的解决方案后,我没有试图解决这个问题 – 2010-06-17 13:55:00