I’m engaged on an e mail app utilizing MailCore2
bundle. It really works superb on simulator nevertheless it crashes on actual units. I’m sharing my code as nicely, please look into and assist me out as I’m caught on this.
non-public let session: MCOIMAPSession
func fetchEmailsFromServer(folder: String, completion: @escaping (Outcome<[EmailEntity], Error>) -> Void) {
// Verify if fetching is already in progress
guard !isFetching else {
completion(.failure(NSError(area: "IMAPService", code: -1, userInfo: [NSLocalizedDescriptionKey: "Fetch already in progress"])))
return
}
isFetching = true
print("Fetching emails from folder: (folder), isFetching: (isFetching)")
let nextUID = nextEmailUIDs[folder] ?? 1
print("it comes right here")
guard nextUID > 0 else {
print("Invalid nextUID: (nextUID)")
completion(.failure(NSError(area: "IMAPService", code: -4, userInfo: [NSLocalizedDescriptionKey: "Invalid UID range"])))
return
}
print("it comes right here too (nextUID)")
let requestKind: MCOIMAPMessagesRequestKind = [.headers, .structure, .internalDate, .fullHeaders]
guard let vary = MCOIndexSet(vary: MCORange(location: nextUID, size: 100)) else {return}
print("request type: (requestKind)")
print("request vary: (vary)")
// Use session instantly since it's non-optional
guard let fetchOperation = session.fetchMessagesOperation(withFolder: folder, requestKind: requestKind, uids: vary) else {
print("error fetching")
return
}
print("request fetchOperation: (fetchOperation.debugDescription)")
fetchOperation.begin { error, messages, _ in
self.isFetching = false
print("Fetching emails accomplished for folder: (folder), isFetching: (self.isFetching)")
print("it comes right here")
if let error = error {
print("Fetch operation error: (error.localizedDescription)")
completion(.failure(error))
return
}
guard let messages = messages else {
print("No messages fetched.")
completion(.failure(NSError(area: "IMAPService", code: -2, userInfo: [NSLocalizedDescriptionKey: "Failed to parse messages"])))
return
}
var emails: [EmailEntity] = []
let group = DispatchGroup()
for message in messages {
group.enter()
self.fetchEmailDetails(for: message, folder: folder) { lead to
if case .success(let e mail) = outcome {
emails.append(contentsOf: e mail.emails)
}
group.depart()
}
}
group.notify(queue: .primary) {
if let lastMessage = messages.final {
self.nextEmailUIDs[folder] = UInt64(lastMessage.uid + 1)
}
if emails.isEmpty {
print("No emails parsed efficiently.")
completion(.failure(NSError(area: "IMAPService", code: -6, userInfo: [NSLocalizedDescriptionKey: "No emails fetched"])))
} else {
completion(.success(emails))
}
}
}
}
It really works completely on simulator nevertheless it crashes on actual units.
What i’m assuming is MCOIMAPSession
is inflicting that crash on actual gadget.