2017-01-04 11 views
1

Ich arbeite an einer Shopping-App, wo ich Web-Services verwenden, um Daten wie Produktliste usw. zu holen. Aber es dauert zu viel Zeit zu laden und macht meine App wirklich langsam.Laden Sie Daten vom Server schnell iOS

Gibt es eine Lösung für dieses Problem?

unten ist der Code, den ich versucht habe, Produktliste zu bekommen.

NSURL * Url=[NSURL URLWithString:@"URL/api/product"]; 
NSData * Data=[NSData dataWithContentsOfURL:Url]; 
NSString *str=[[NSString alloc]initWithData:Data encoding:NSUTF8StringEncoding]; 
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[strinng dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil]; 

kann nicht JSON Antwort, weil es zu viel ist.

+0

Ist es Ihr Backend? Können Sie irgendwelche Anfragen/Antworten ändern? –

+1

Versuchen Sie, AFNetworking zu verwenden, und senden Sie eine Anforderung in ViewWillAppear –

+0

Caching/prefetching/download in einem separaten Thread ist der Schlüssel zu guter Netzwerkleistung. – Bogatyr

Antwort

2

Es gibt keine RIGHT oder WRONG Weg für diese. Aber es gibt einige Punkte, die wir für schnelles Datenladen berücksichtigen können.Ich kann diese Punkte erwähnen und es können auch viele andere Punkte sein:

  1. Verwenden AFNetworking (für Objective-C) oder Alamofire (für swift), für Web-Services aufrufen und bekommen Antwort.
  2. Tun Sie nicht zu viele Dinge in viewDidLoad. Versuchen Sie, so wenig wie Operationen zu machen.
  3. Sie können Web-Service in viewDidLoad oder in viewWillAppear rufen Hauptthread
  4. Nachdem ich Antwort Update UI (es wird jedes Mal, wenn Sie Bildschirm besuchen bekommen genannt). Siehe this Post.
  5. Wenn Sie Bilder von URLs anzeigen möchten, laden Sie sie asynchron. Sie können Drittanbieter-Bibliothek wie verwenden Oder verwenden Sie Erweiterungen in AFNetworking und Alamofire
  6. Wenn Sie Liste der Produkte in Liste anzeigen möchten, verwenden Sie Load More Funktionalität. Zu diesem Zweck sollten Ihre APIs intelligent genug sein, die unter Verwendung pagination implementiert werden.
  7. Verwenden Sie UITableView oder UICollectionView zum Anzeigen von wiederverwendbaren Komponenten.

Bis jetzt kann ich diese Punkte hervorheben. Wenn ich etwas anderes gefunden habe, werde ich meine Antwort aktualisieren.

0

Starten Sie das Laden der Daten aus der API beim Start der App (AppDelegate) und speichern Sie die Antwortdaten in einem Modell. Auf diese Weise würde die Zeitverzögerung reduziert werden. Sie können auch versuchen, die Antwort in CoreData zu speichern. Wenn die Ansicht geladen ist, können Sie die Daten aktualisieren.

Hoffe, das hilft.

+0

Ich habe verschiedene Module, wie Produktliste wird alle Details der Produkt-und Warenkorb-Liste, wo alle Produkte sind spontan hinzugefügt oder gelöscht, so wie kann ich alles in App Delegate hinzufügen? :/wenig verwirrt, kannst du es ein wenig mehr erklären :) –

+0

Dann musst du mit Kerndaten arbeiten. Ich meine, initialisiere die Klassen, um Daten vom Server in AppDelegate zu bekommen, so dass das Datenholen viel bevor du einen VC öffnest beginnt. In Ihrem Fall wäre CoreData der richtige Weg. –

+0

Okay, ich weiß wirklich nicht viel über Kerndaten, ich werde es googeln: P aber hast du irgendeinen Link, der es mir leicht machen kann, diesen ganzen Prozess zu durchlaufen? –

0

Nichts kann auf Ihrer Seite getan werden, um den Prozess zu beschleunigen, wenn die Daten, die Sie erhalten, reichlich vorhanden sind.

  1. Sie sollten Ihre APIs teilen, wahrscheinlich wird eine API Ihnen die Liste von Produkten geben.
  2. Machen Sie eine API in der Weise, nur Anfrage Anzahl der Produkte zu senden und die Anzahl der Produkte sollte auf Ihrem Telefon Bildschirmauflösung und Anzahl der Produkte, die dort angezeigt werden können basieren. Zum Beispiel könnte es 4 auf dem iPhone 4 sein, während 6 auf dem iPhone 6 sind. Beim Scrollen rufen Sie diese API erneut auf, um weitere 4 oder 6 Produkte zu erhalten.
  3. Wenn Sie auf ein bestimmtes Produkt klicken, verwenden Sie eine andere API, um den Inhalt zu erhalten.
+0

Sie haben Recht, aber leider kann ich nicht all dies tun :(Ich kann nur meinen Code verbessern. –

+0

Sie sind nicht allein in dieser Ausgabe Sie können Änderungen vornehmen oder damit leben :( – Matt

+0

Wenn Sie weniger Daten erhalten, aber viel Zeit benötigen, können wir etwas dagegen unternehmen, wenn Sie den Code bereitstellen können. – Matt

1

Es wird besser sein, wenn Sie zeigen, was Sie für das tat, aber entsprechend Ihrer Anforderung ich Ihnen vorschlagen,

  1. Verwenden AFNetworking mit dem Server kommunizieren kann, ist es etwas schneller.

  2. Wenn Sie eine Anfrage an den Server in der neuen Version ViewController senden, vergewissern Sie sich, dass Sie die Anfrage in viewWillAppear senden werden.

  3. Versuchen Sie zu vermeiden, zu viele Daten gleichzeitig zu erhalten.

  4. Versuchen Sie zu verwenden Asynchronous Anfrage bedeutet, dass es nicht warten wird. Sie verwenden Asynchronous bedeutet, dass es nicht warten wird. bedeutet, dass der Thread, der diese Operation initiiert hat, auf die Beendigung der Aufgabe wartet, bevor er fortfährt.

+0

Wenn Sie es in ViewWillAppear aufrufen, wird es jedes Mal aufgerufen, wenn Sie den Bildschirm besuchen. Wenn ich zum nächsten Bildschirm gehe und zurückkomme, muss ich die API nicht erneut aufrufen. Also ich stimme nicht mit # 2 – Pushkraj

+0

Dann, was wird Ihnen vorschlagen, Sir, ich meine, wo diese sendende Anfrage, weil sie diese Daten in TableView anzeigen müssen ..... @Pushkraj –

1

Verwenden Sie einfach NSURLSession. Es ist eine gute API von Apple. Denken Sie nur daran, die zentrale Dispatch-Funktion "get mainQueue" im Abschlussblock zu verwenden, um eine beliebige Benutzeroberfläche zu aktualisieren.

Verwandte Themen