Tôi đang làm việc trên một số IAP using this tutorial.Trình xử lý hoàn thành gây EXC_BAD_ACCESS khi cùng một phương thức được gọi hai lần
Trước hết tôi lấy sản phẩm với điều này:
-(void)fetchAvailableProductsFirstLoad:(BOOL)firstTimeLoading {
[[IAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) { ...
Các helper chạy như sau:
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
@synchronized(self) {
// 1
_completionHandler = [completionHandler copy];
// 2
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];
}
}
Khi sản phẩm được trả lại hoặc thất bại sau được gọi là:
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(@"Loaded list of products...");
_productsRequest = nil;
NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
NSLog(@"Found product: %@ %@ %0.2f",
skProduct.productIdentifier,
skProduct.localizedTitle,
skProduct.price.floatValue);
}
_completionHandler(YES, skProducts);
_completionHandler = nil;
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
NSLog(@"Failed to load list of products.");
NSLog(@"Error: %@",error);
_productsRequest = nil;
_completionHandler(NO, nil);
_completionHandler = nil;
}
Số phát hành
Vấn đề chúng tôi gặp phải là khi người dùng bắt đầu tìm nạp hoặc sản phẩm hai lần. Ví dụ: các sản phẩm tìm nạp được gọi trên viewDidLoad, nhưng nếu người dùng có kết nối xấu/chậm và điều hướng đi và sau đó quay lại bộ điều khiển. Tìm nạp ban đầu không bị hủy vì vậy có hai lần chạy.
Tôi tin rằng vấn đề là khi thứ hai được trả lại và con trỏ đã thay đổi/không tồn tại/hỏng.
Các EXC_BAD_ACCESS 2 mã lỗi xảy ra trên dòng tương ứng:
_completionHandler(YES, skProducts);
HOẶC
_completionHandler(NO, nil);
Cảm ơn, tôi đã sử dụng các phần của cả hai câu trả lời nhưng điều này là gần nhất. Tôi cũng đã thêm một phương thức bổ sung '- (void) cancelProductRequest { [_productsYêu cầu hủy bỏ]; _productsRequest = nil; } 'hủy bỏ yêu cầu hiện tại nếu chúng điều hướng khỏi bộ điều khiển đó để lưu ở đó bao giờ có nhiều yêu cầu. – StuartM
Great @StuartM, chắc chắn là tốt nhất để hủy yêu cầu nếu bạn không cần nó. Mừng vì tôi có thể giúp! – stefandouganhyde