Крис, 2 вещи: -
Во-первых, почему вы выбрали многопоточный подход?
Ничто здесь не требует от вас создания новой темы. API StoreKit является асинхронным, как вы знаете, вы, в конце концов, используете обратные вызовы и делегаты. Это сделано специально, чтобы не блокировать основной поток, и вам не нужно создавать новый поток. Он почти наверняка работает в фоновом потоке - но вам не нужно это знать, он обрабатывается для вас. Фактически, этот код не только не требует фонового потока, вы почти наверняка испытываете значительные затраты производительности, порождая новые потоки для выполнения такой небольшой работы. то есть. (вероятно) потребуется больше времени для запуска потока, чем для выполнения запланированной вами работы.
Итак, если вашей мотивацией было выступление, вы будете разочарованы.
Во-вторых, ваш код многопоточности или его отсутствие беспорядок. С другой стороны, просто повторюсь, ничего из этого не нужно, так что никаких больших проблем.
Вы говорите, что вы
с использованием одного и того же многопоточного кода во многих
в других местах и работает нормально
- Тебе не повезло. Это создало у вас впечатление, что это должно сработать, когда оно совершенно небезопасно. Потоки действительно сложны, и если вы хотите это сделать, вы можете сделать хуже, чем читать некоторые связанные документы Apple
Threading
параллелизм
Я не хочу просто извергать материал прямо из этих руководств, перевести через мой туманный мозг и попытаться передать это как мой собственный совет, но чтобы попытаться мотивировать вас читать руководства, к которым я добавил некоторые комментарии пара строк вашего кода: -
// you start a new background thread to call -loadStore
[NSThread detachNewThreadSelector:@selector(loadStore) toTarget:self withObject:nil];
// you initialize SKPaymentQueue singleton on the background thread - is this allowed? i dont know. I can't see it documented.
// then you add transactionObserver observer on the background thread - which thread do you want to receive notifications on? 1)Main thread, 2)this (background) thread, 3)unsure. If it's not the background thread this probably isnt a good idea
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
// Update the GUI from the background thread. No joking here - you absolutely can never do this. It's well documented.
[self doneSpinning];
// end of method, background thread exits or not? You tell me. hope we get lucky with those notifications
[pool release];
Итак, я хотел бы добавить, что я определенно не эксперт в том, как работает покупка приложений, но могу поспорить, что в этом нет ничего особенного. Вероятно, с вашим счетчиком активности все будет в порядке, если вы избавитесь от фонового потока или повторно внедрите его безопасным для потока способом (что, на мой взгляд, здесь не выглядит проблемой).