Je développe une application de chat en utilisant XMPPFramework de Robbiehanson, quand mon application reçoit beaucoup de strophes, l'interface utilisateur de l'application se bloque, c'est comme ça que je crée mon flux.L'interface utilisateur de l'application se bloque lorsque plusieurs strophes sont reçues
L'interface utilisateur de l'application se bloque principalement lorsque l'infrastructure tente d'envoyer des réceptions par rapport à un message reçu ou lorsque le gestionnaire de flux tente d'envoyer des accusés de réception à une section reçue.
Voici comment je configure mon flux.
// Stream Setup
if (!self.xmppStream || ![self.xmppStream isConnected]) {
self.xmppStream = [[XMPPStream alloc] init];
[self.xmppStream setHostName:kGetChatServerURLString];
// [self.xmppStream setHostPort:kBPChatServerPort];
[self.xmppStream setHostPort:kBPChatServerPort];
[self.xmppStream setStartTLSPolicy:XMPPStreamStartTLSPolicyAllowed];
self.xmppReconnect = [ [XMPPReconnect alloc] init];
[self.xmppReconnect setAutoReconnect:YES];
self.xmppRosterMemStorage = [[XMPPRosterMemoryStorage alloc] init];
self.xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:self.xmppRosterMemStorage dispatchQueue:dispatch_get_main_queue()];
self.xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = true;
self.xmppRoster.autoFetchRoster = true;
[self.xmppRoster activate:self.xmppStream];
self.xmppMUC = [[XMPPMUC alloc] initWithDispatchQueue:_backgroundQueue];
[self.xmppMUC activate:self.xmppStream];
// To enable socket in the background.
[self.xmppStream setEnableBackgroundingOnSocket:YES];
// Moved the function to here from DidConnect to fix multiple delivery reports sending issue after reconnect.
[self setupAutoSendDeliveryReceipts];
XMPPMessageCarbons *xmppMessageCarbon = [[XMPPMessageCarbons alloc] initWithDispatchQueue:_backgroundQueue];
[xmppMessageCarbon activate:self.xmppStream];
[xmppMessageCarbon setAutoEnableMessageCarbons:YES];
//XEP-0191: Blocking Command
self.xmppBlocking = [[XMPPBlocking alloc] initWithDispatchQueue:_backgroundQueue];
[self.xmppBlocking activate:self.xmppStream];
[self.xmppStream addDelegate:self delegateQueue:_backgroundQueue];
[self.xmppReconnect addDelegate:self delegateQueue:_backgroundQueue];
[self.xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
[self.xmppMUC addDelegate:self delegateQueue:_backgroundQueue];
[self.xmppBlocking addDelegate:self delegateQueue:_backgroundQueue];
[[BPCXMPPvCardStorageManager sharedInstance] activateWithStream:self.xmppStream];
[[BPCChatRoomsManager sharedManager] activateWithStream:self.xmppStream];
}
// Stream Setup Gestionnaire
- (void)setupStreamManagement {
if (kBPCTempEnableStreamManagement) {
//Intialize with XMPPStreamManagementMemoryStorage
XMPPStreamManagementMemoryStorage *xmppSMMS = [[XMPPStreamManagementMemoryStorage alloc] init];
self.xmppStreamManagement = [[XMPPStreamManagement alloc] initWithStorage:xmppSMMS dispatchQueue:_backgroundQueue];
//Activate with stream
[self.xmppStreamManagement activate:self.xmppStream];
self.xmppStreamManagement.autoResume = YES;
[self.xmppStreamManagement enableStreamManagementWithResumption:YES maxTimeout:0];
[self.xmppStreamManagement requestAck];
[self.xmppStreamManagement sendAck];
[self.xmppStreamManagement automaticallySendAcksAfterStanzaCount:1 orTimeout:0];
}
}
// Activer les livraisons automatique de messages
XMPPMessageDeliveryReceipts *xmppMessageDeliveryReceipts = [[XMPPMessageDeliveryReceipts alloc] initWithDispatchQueue:dispatch_queue_create("messageDeliverReceiptsQueue", DISPATCH_QUEUE_CONCURRENT)];
xmppMessageDeliveryReceipts.autoSendMessageDeliveryReceipts = YES;
xmppMessageDeliveryReceipts.autoSendMessageDeliveryRequests = YES;
[xmppMessageDeliveryReceipts activate:self.xmppStream];
La file d'attente d'arrière-plan que j'utilise est:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
Comment puis-je résoudre ce problème?
'sendAck' n'est pas nécessaire si' automaticSendAcksAfterStanzaCount' est utilisé. –