bizz84 / bizz84/SwiftyStoreKit

Question about parallelism

Open
#713 0 comments 0 reactions 0 assignees View on GitHub
type: question
Dominant language
Swift
Stars
6.7k
Forks
801
PR merge metrics
No merged PRs in 30d

Description

## Question

Hi, thanks for this lib.

I would just like to understand the mechanics behind the lib. Although I use it, I would just like to confirm with you that the transactions that Apple sends us are in a kind of queue in its lib and within the transaction loop this queue is being consumed.

In practice, what I want to validate is actually just a guarantee that this queue will never be processed in parallel or multiple times, but always in the sequence of received transactions.

Example for complete purchases (it run in parallel or only in sequence?):

```swift
DispatchQueue.global(qos: .background).async {
SwiftyStoreKit.completeTransactions(atomically: false) { purchases in
ItunesSubscriptionSystemService.completePurchases(purchases: purchases, onSuccess: {
DispatchQueue.global(qos: .background).async {
var canFinishTransaction = false

for purchase in purchases {
// process transaction
canFinishTransaction = false

if purchase.transaction.transactionState == .purchased {
let receiptData = SwiftyStoreKit.localReceiptData
let receiptString = (receiptData != nil ? receiptData!.base64EncodedString(options: []) : "")

//[...]
//canFinishTransaction = true
} else if purchase.transaction.transactionState == .restored {
let receiptData = SwiftyStoreKit.localReceiptData
let receiptString = (receiptData != nil ? receiptData!.base64EncodedString(options: []) : "")

//[...]
//canFinishTransaction = true
} else if purchase.transaction.transactionState == .failed {
//canFinishTransaction = false
}

sleep(1)

if canFinishTransaction, purchase.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(purchase.transaction)
}
}
}
}, onError: { _ in
//
})
}
}
```

Example about restore:

```swift
DispatchQueue.main.async {
UIUtil.showAlertLoading()
}

DispatchQueue.global(qos: .background).async {
SwiftyStoreKit.restorePurchases(atomically: false, applicationUsername: "", completion: { results in
DispatchQueue.global(qos: .background).async {
if results.restoreFailedPurchases.count > 0 {
// [...]
// exit
} else if results.restoredPurchases.count > 0 {
var canFinishTransaction = false

for (index, purchase) in results.restoredPurchases.enumerated() {
// canFinishTransaction = true
// [...]
// UIUtil.hideAlertLoading()
}
} else {
// UIUtil.hideAlertLoading()
}
}
})
}
```

Contributor guide

Open the contributing guide

Research direction

Start by reading the transaction and restore examples in the issue body, then inspect the library's documented behavior for completeTransactions and restorePurchases. Clarify whether callbacks or purchase arrays are processed serially or in parallel, and whether transaction ordering is guaranteed; done means the behavior is answered or documented.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
mobile, payments
Issue type
Documentation
Difficulty
1/5
Estimated time
Under an hour
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.