Votre problème est assez fréquent quand les gens commencent à utiliser NSUrlConnection
délégués,
La première chose que vous configurez le délégué des deux points de vue sur le même objet, qui peut fonctionner, mais aura besoin de carriole.
Je recommande l'une des solutions suivantes:
Solution 1 (utilise les délégués, plus de travail)
Créer une nouvelle classe, et donner lui donner la NSURlconnection
delegate protocol et appellent quelque chose comme apiFetchDelegate
Ensuite, placez vos méthodes de délégués y -(void) connectionDidFinishLoading
, etc ..
Maintenant, dans votre méthode viewDidLoad
, le changer à ce qui suit:
NSURL *headlineurl = [NSURL URLWithString:@"api1"];
headlinerequest = [NSURLRequest requestWithURL:headlineurl];
//Create a new instance of the delegate
apiFetchDelegate* headlineDelegate = [[apiFetchDelegate alloc] init];
[[NSURLConnection alloc] initWithRequest:headlinerequest delegate:headlineDelegate];
Et le second délégué:
NSURL *mostnewsurl = [NSURL URLWithString:@"api2"];
NSURLRequest *mostnewsrequest = [NSURLRequest requestWithURL:mostnewsurl];
//Create second delegate
apiFetchDelegate* mostnewsDelegate = [[apiFetchDelegate alloc] init];
[[NSURLConnection alloc] initWithRequest:mostnewsrequest delegate:mostnewsDelegate];
maintenant comme vous le voyez, chacun aura son propre délégué, et les données ne seront pas être mélangé plus!
Solution 2 (sans délégués, moins de travail à faire)
Ceci est probablement une meilleure solution pour vos besoins, je ne sais pas pourquoi vous avez besoin des délégués pour un simple appel, mais si vous ne Il vaut mieux aller de cette façon simple!
Nous ferons async appels pour éviter le gel de l'interface utilisateur lorsque les données sont en cours de récupération, cela nécessitera une NSOperationQueue
, voici comment ça va marcher:
Dans la méthode viewDidLoad, modifiez le code à ceci:
//Create your Queue here
NSOperationQueue *apiCallsQueue = [NSOperationQueue alloc] init];
[apiCallsQueue setMaxConcurrentOperations:2];
NSURL *headlineurl = [NSURL URLWithString:@"api1"];
headlinerequest = [NSURLRequest requestWithURL:headlineurl];
[NSURLConnection sendAsynchronousRequest:headlinerequest queue:apiCallsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
//Here is your data for the first view
//
NSLog(@"Data for headline view: %@", [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding]);
}];
et pour la deuxième vue:
NSURL *mostnewsurl = [NSURL URLWithString:@"api2"];
NSURLRequest *mostnewsrequest = [NSURLRequest requestWithURL:mostnewsurl];
[NSURLConnection sendAsynchronousRequest:mostnewsrequest queue:apiCallsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
//Here is your data, for the second view
//
NSLog(@"Date for latest news: %@", [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding]);
}];
Laissez-moi savoir si cela fonctionne pour vous ou si vous avez besoin d'aide.
S'il vous plaît donner plus de détails sur ce que vous voulez accomplir, ce n'est pas clair. –
Je veux extraire des données d'une URL différente dans les vues de collection – Sezgin
Eh bien, je vois que vous êtes probablement en train de tous les paramétrer pour le même délégué, qui finira par entrer dans les données et vous n'aurez aucune idée d'où ça vient, je vais vous donner un petit exemple sur la façon de le faire maintenant. –