Je suis relativement nouveau à l'objectif-c, et ayant un problème de synchronisation de thread. J'essaye de renvoyer une image à l'utilisateur (par l'URL d'image fournie par l'utilisateur). Je lance le téléchargement d'image dans un fil séparé, avec la fonction de filetage déclarée et définie dans ma classe actuelle. Le problème est que le fil est CHAISE, ma fonctionnalité de téléchargement de l'image ne fonctionne pas (c.-à aucune des méthodes NSURLConnection OBTIENNENT appeléMultithreading issue
Ma fonction de la classe pour initier le fil et le téléchargement de l'image est la suivante:.
- (NSMutableData*)download:(NSString*)strURL
{
self.strURLData=strURL;
[NSThread detachNewThreadSelector:@selector(threadMethod:) toTarget:[ICacheImageDownloadMgr class] withObject:self];
//Here ICacheImageDownloadMgr is my current class
while(!bCompletionFlag)
{
if(bCompletionFlag)//bCompletionFlag is set to TRUE in NSURLConnection::connectionDidFinishLoading method after successful image download
{
return currentData;
}
}
}
mon seul motif est ici pour revenir « CurrentData » après le processus de téléchargement d'image terminée, l'utilisateur et la méthode de fil déclaré dans ma classe actuelle (c.-à-ICacheImageDownloadMgr) est la suivante:.
+ (void) threadMethod:(ICacheImageDownloadMgr*)param
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
if(param.currentData)
{
[param.currentData release];
param.currentData=nil;
}
param.currentData = [[NSMutableData alloc]initWithLength:0];
NSURL *myURL = [[NSURL alloc] initWithString:param.strURLData];
NSURLRequest *URLRequest = [NSURLRequest requestWithURL: myURL];
param.urlcon = [[NSURLConnection alloc]initWithRequest:URLRequest delegate:self startImmediately:YES];
[myURL release];
param.dataLock = [[NSLock alloc]init];
while(!param.bCompletionFlag)
{
if([param.dataLock tryLock])
{
if(param.bCompletionFlag)//bCompletionFlag is set to TRUE in NSURLConnection::connectionDidFinishLoading method after successful image download, along with NSLock unlock call
{
break;
}
}
}
[pool release];
}
S'il vous plaît laissez-moi savoir ce que je fais mal ici? Il semble que mes deux threads ici sont en blocage et c'est pourquoi mes méthodes NSURLConnection ne sont pas appelées. Encore une fois, comme indiqué précédemment, mon seul but est de retourner "currentData" à l'utilisateur.
Merci,
merci pour vos conseils sur l'utilisation de sendSynchronousRequest. C'est exactement ce que j'avais l'intention de faire. Mon code fonctionne maintenant. Cependant, je ne suis toujours pas capable de comprendre pourquoi mon implémentation des méthodes de délégué NSURLConnection (comme didReceiveResponse, didReceiveData, et connectionDidFinishLoading) n'était pas appelée dans mon code? Je suppose que, comme mentionné par tia, la boucle while dans mon threading principal bloquait l'application elle-même. – XMarshall
Vous devriez avoir créé une boucle d'exécution dans votre thread je pense ... dans votre thread vous entrez un moment qui ne permet pas la réponse à traiter je pense ... vous pouvez lire ceci: http: //developer.apple. com/Bibliothèque/ios/# documentation/Cocoa/Conceptuel/Multithreading/RunLoopManagement/RunLoopManagement.html – sergio