2013-06-13 3 views
-2

J'utilise 2 UICollectionView sur un écran et récupère 2 jeux de données différents à partir de mon API.Connexion multiple dans ios

Mais le problème est que je n'arrive pas à résoudre les différences entre les données entrantes en fonction de la vue demandée.

Voici un extrait de code de ce que je fais dans le UICollectionView:

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    NSURL *headlineurl = [NSURL URLWithString:@"api1"]; 
    headlinerequest = [NSURLRequest requestWithURL:headlineurl]; 
    [[NSURLConnection alloc] initWithRequest:headlinerequest delegate:self]; 

    NSURL *mostnewsurl = [NSURL URLWithString:@"api2"]; 
    NSURLRequest *mostnewsrequest = [NSURLRequest requestWithURL:mostnewsurl]; 
    [[NSURLConnection alloc] initWithRequest:mostnewsrequest delegate:self]; 

} 

Et ceci est le code du délégué:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    //What should I do here ? 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData 
{ 
    //What should I do here ? 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    //What should I do here ? 
} 

Merci beaucoup.

+1

S'il vous plaît donner plus de détails sur ce que vous voulez accomplir, ce n'est pas clair. –

+0

Je veux extraire des données d'une URL différente dans les vues de collection – Sezgin

+0

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. –

Répondre

1

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 NSURlconnectiondelegate 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.