2010-06-14 121 views
0

目前我正在从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发送产品请求,但没有成功。

  • 为什么?发生什么事 ?
  • 如何解决问题?

回答

0

好吧,我有这个问题至今:

的通知显示在主运行循环总是传送,所以运行的循环可能不会停止。 由于在主运行循环中初始化的共享实例,所以没有办法规避 它。

我终于做了什么:我向共享实例添加了一个标志,指示产品列表 是否已到达。在您尝试购买产品之前,您必须询问是否已加载产品, 否则会弹出一个UIAlertView并通知您产品列表尚未得到验证,您应该在短时间后重试该产品列表。

工作;为了保证您只获得有效的产品,产品信息只能从共享实例中获取。

0

我想你会在产品加载时阻止你的GUI。在这种情况下,用户不能改变任何东西。例如:我使用透明视图+ uiactivityindicator在应用商店工作期间阻止应用。

+0

由于GUI在主运行循环中工作,冻结的原因现在已知。不幸的是,我需要didReceiveResponse,并且消息在主线程上运行*,因此使用另一个线程初始化共享实例并阻止GUI直到我收到更复杂。在我的解决方案后,我没有试图解决这个问题 – 2010-06-17 13:55:00