У меня есть приложение, которое выполняет вход в веб-сервис, а затем запрашивает список объектов, используя sessionid, полученный во время входа в систему.
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] ;
}
Вылетает, если я получаю доступ к любому объекту в любом одноэлементном объекте или AppDelegate. Отладчик показывает, что одноэлементный объект или Appdelegate действителен и инициализирован, но ЛЮБОЕ свойство этого объекта недопустимо, и доступ приводит к сбою.
Это странная ошибка, связанная с потоками. Единственное, о чем я могу думать, это то, что NSOperation имеет недопустимые копии всех других объектов в своем потоке или что-то в этом роде.
Не происходит сбой, если делать то же самое в порожденном вручную потоке, используя [NSThread detachNewThreadSelector: @selector (executeList) toTarget: self withObject: nil];
Я хочу использовать NSOperation вместо NSThread detach ... потому что NSOperation предоставляет очередь.
Каков оптимальный шаблон для такой ситуации? определить ListOperation как параллельную операцию? Я не хочу сложной путаницы с определением параллельной операции.
Я думаю, что мой случай довольно прост, и должно быть простое решение?