У меня есть приложение, которое выполняет вход в веб-службу, а затем запрашивает список объектов, используя sessionid, полученный во время входа в систему.Как получить доступ к другим объектам из NSOperation? Проблемы с Threading приводят к сбою
Appdelegate.h
....
@property (nonatomic, retain) NSString *sessionId;
AppDelegate.m:
-(id)init{
queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
.....
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
LoginOperation *loginOperation = [[LoginOperation alloc] init];
[queue addOperation:loginOperation];
[loginOperation release];
ListOperation *listOperation = [[ListOperation alloc] init];
[queue addOperation:listOperation];
[listOperation release];
}
LoginOperation:
-(void) main {
...
[[UIApplication sharedApplication] delegate] setSessionId:sessionID];
...
}
ListOperation:
-(void)main{
//Crashes at next line:
NSString *sessionId = [[UIApplication sharedApplication] delegate] sessionId] ;
}
Это сбой, если я пользуюсь любым proeprty в любом объекте singleton или AppDelegate. Отладчик показывает, что объект singleton или Appdelegate действителен и инициализирован, но свойство ANY этого объекта недействительно, и доступ приводит к сбою.
Это какая-то странная проблема, связанная с резьбой. Единственное, о чем я могу думать, это то, что NSOperation имеет недопустимые копии всех других объектов в своем потоке или что-то в этом роде.
Это не сбой, если он делает то же самое в ручном породе, используя [NSThread detachNewThreadSelector: @selector (performList) toTarget: self withObject: nil]; Я хочу использовать NSOperation вместо NSThread detach ... потому что NSOperation предоставляет очередь.
Каков оптимальный шаблон для такой ситуации? определяя ListOperation как параллельную операцию? Мне не нужен сложный беспорядок с определением параллельной операции.
Я думаю, что мой случай довольно прост и должно быть простое решение?
звучит как состояние гонки или более выпущенный объект. Что такое sessionID? Что такое авария? Backtrace? Здесь недостаточно информации, чтобы отлаживать его как есть. – bbum
Отладчик показывает, что объект, к которому я обращаюсь, действителен, но все свойства объекта недействительны. Я попытался получить доступ к некоторому объекту singleton из NSOperation и создать те же условия сбоя. Поэтому BAD_ACCESS аварийно завершает работу. – Rod
Я попытался сделать это одновременным NSOperation, с помощью метода start() и всего остального. В руководстве говорится, что одновременное выполнение выполняется в новом потоке. Поэтому я подумал, что это может решить проблему. Но это не так. Крушение точно такое же! – Rod