嵌套的完成块未被调用

时间:2014-11-21 01:23:00

标签: ios objective-c objective-c-blocks

我有一个嵌套的完成块设置来初始化SKProduct。如果我在完成块之前放置断点,则内部块执行OK(我可以轮询_product)但是完成块永远不会触发。

如果我在此块中立即调用completion()它会执行,但如果我在嵌套块的完成块中调用它,则不会。

- (void)initializeProduct:(NSString*)bundleId completion:(void(^)(BOOL finished, NSError* error))completion
{
    // completion(YES, nil); If I call completion here, it executes
    NSSet* dataSet;
    dataSet = [[NSSet alloc] initWithArray:@[bundleId]];
    [IAPShare sharedHelper].iap.production = NO;

    if(![IAPShare sharedHelper].iap) {
        NSSet* dataSet = [[NSSet alloc] initWithObjects:bundleId, nil];
        [IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet];
        [IAPShare sharedHelper].iap.products = @[bundleId];
    }

    [[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest* request,SKProductsResponse* response)
     {
         if(response > 0 ) {
             _product = [[IAPShare sharedHelper].iap.products objectAtIndex:0]; // We get this far
             // ^ breakpoint on this line shows _product is now an SKProduct 
             completion(YES, nil); // but this never fires
         }
         else
         {
             completion(YES, error);
                           // ^ yes, error is defined in my code, I'm being lazy
         }
     }];
}

我用另一个完成块在这样的方法中调用它(并且它永远不会进入块):

- (void)priceForBundleId:(NSString *)bundleId completion:(void(^)(NSString* price))completion
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NO), ^{
        [self initializeProduct:bundleId completion:^(BOOL finished, NSError *error) {
            // Breakpoint placed here never catches
            if (!error)
            {
                NSString* price = [RSStore priceAsStringForLocale:_product.priceLocale price:_product.price];
                [defaults setValue:price forKey:@"bigBoxPrice"];
                completion(price);
            }
            else
            {
                completion(nil);
            }

        }];
    });
}

0 个答案:

没有答案