Le problème que je rencontre est le suivant:
J'ai un Cependant, je dois afficher ces lignes triées par ordre alphabétique pour lesquelles j'utilise le nssortDescriptor suivant: p> et voici quand les choses changent, la récupération L'opération prend maintenant environ 3 secondes pour terminer car les 6000 lignes sont triées. Évidemment pendant ces secondes, l'interface utilisateur est bloquée et que l'expérience utilisateur est terrible. P> Je sais que je pouvais faire l'extraction dans un fil d'arrière-plan puis passer aux identifiants d'objet au fil principal, mais dans ce cas comment Puis-je toujours utiliser le J'ai aussi Les idées seraient très appréciées, merci! P> P> utableview code> que je nourris avec des données à partir d'un
NsfetchedResultSluTroller code> qui extrait environ 6000 lignes des données de base. Le
fetchbatchsize code> du
nsfetchrequest code> est défini sur 20 et si je n'applique aucun
nssortdescriptor code> la récupération est suffisamment rapide pour ne pas bloquer le fil de l'interface utilisateur. p>
NsfetchedResultStroller code> dans le thread principal (je l'utilise également pour observer les modifications sur les données)? P>
indexé code> le Attribut sur lequel je trie mais qui optimise uniquement les regards et ne pas trier les performances. P>
6 Réponses :
Avez-vous essayé d'exécuter la performanceFetch: méthode en arrière-plan, avec
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ [controller performFetch]; });
Ce n'est pas une solution sûre. NsfetchedResultController a un gantEdObjectContext qui n'est pas sûr du fil.
Je suis d'accord avec @tal BereznitsKey. Toute autre idée?
Utiliser un cache aiderait probablement à obtenir une meilleure performance. p>
J'ai le même problème et j'ai compris que, dans le premier appel, la récupération a besoin de plus de 3 secondes, mais effectuant la récupération deux fois, cela montre immédiatement ses résultats. P>
Oui, le cache aide à toutes les extratures ultérieures, mais la première est toujours terriblement lente, bloquant sensiblement le fil de l'interface utilisateur.
Affichage de 6000 lignes dans une table peut ne pas être la meilleure solution en termes d'expérience utilisateur. Peut-être devriez-vous ajouter une table de filtres avant. Semblable aux groupes dans le carnet d'adresses. Cela ferait peut-être une meilleure expérience utilisateur si vous parvenez à réduire le nombre de lignes par option de filtrage à un numéro plus gérable. Cela réduirait la période de charge et le temps de défiler. P>
Je ne sais pas quel type de données vous affichez-vous, alors peut-être qu'il n'y a aucun moyen mais d'afficher tout dans une liste longue. Pour les personnes, vous pouvez ajouter des options pour le sexe et les groupes d'âge. Pour les voitures, vous pouvez ajouter un filtre par marque et par modèles .... p>
Je sais que ce n'est pas le meilleur design de l'UI, mais c'est une exigence et le client n'est pas disposé à le changer. Je pense vraiment que NsfetchedResultController devrait supporter les extratures d'arrière-plan. Merci pour votre commentaire cependant.
Que diriez-vous d'utiliser la propriété Si vous définissez une taille de lot non nulle, la collection d'objets renvoyés
Lorsque la récupération est exécutée est cassée en lots. Quand la récupération est
exécuté, la demande entière est évaluée et les identités de tous
objets correspondants enregistrés, mais pas plus que les données d'objets de lotsize
sera récupéré du magasin persistant à la fois. Le tableau
retourné de l'exécution de la demande sera un objet proxy qui
Défaut de manière transparente des lots à la demande. (En termes de base de données, c'est un
curseur en mémoire.) p>
blockQuote> de Nsfetchrequest's CODE> Propriété? P>
Je fais des importations de lots de fond dans une nsopération qui utilise un NSManageDObject distinct. Périodiquement, je sauvegarde le deuxième contexte, qui incendie une notification pour mettre à jour mon principal nsmanagedContext que mon NsfetchedResultController est accroché. p>
Peut-être qu'une technique similaire pourrait être appliquée à votre fetch p>
Voici un cacao est mon article de ma petite amie à ce sujet: P>
http: // www .cimgf.com / 2011/05/04 / threads-whlefs-Sans-le-maux de tête / p>
et la technique est également mentionnée dans le guide de programmation de données de base "Importation en lots" P>
Tout d'abord, NsfetchedResultController est généralement utilisé sur le fil principal. Et il ne supporte pas l'arrière-plan d'arrière-plan jusqu'à maintenant libération Apple iOS 6. P>
Ainsi, lorsque vous appelez le spectaclefectch de NsfetchedResultController, vous devez "bloquer" le fil principal pendant un moment. Cependant, nous voulons que le temps soit minimal. P>
(Autant que je me souvienne de vous souvenir, vous devez définir un descripteur de tri sur NsfetchedResulttroller. Donc je ne suis donc pas sûr de savoir comment l'avez-vous fait fonctionner lors de la définition d'un descripteur de tri. Jetez un coup d'œil à la référence de la classe) p>
Je ne sais pas si vous utilisez SQLite Store. Si tel est le cas, je peux difficilement croire votre travail de descripteur de tri. (Jetez un coup d'œil au guide de programmation de données de base: section de prise de vue). Sinon, conserver autant de données en mémoire ne serait pas une bonne idée p>
Enfin, nous avons atteint le point pourquoi il est lent. Ce type utilisant "LocalizedcaseSenSensivecompare:" rend votre extraction lente car la cordante UNICODE serait lente. (mentionné dans la performance de données de base de la WWDC 2010 sur iPhone). P>
Autant d'applications autres, vous devez créer un champ de chaîne / une propriété non unicode basé sur votre "OptionText" et Trier en fonction de la propriété String non Unicode. p>
Question stupide mais je suppose que vous ne pouvez pas pré-trier les données avant de le charger sur les données de base?
Question stupide, à l'époque que vous exécutez la demande de récupération Quelle est la valeur de gantedObjectContext.haschanges?