The doBackgroundWork method does not get called from the startDoingWork method.
threading.h
------------
#import <Foundation/Foundation.h>
@interface threading : NSObject {
NSConditionLock* theConditionLock;
NSMutableArray* workItems;
}
-(void)startDoingWork;
-(void)doBackgroundWork;
-(void)notifyBackgroundThreadAboutNewWork;
@end
threading.m
-------------
#import "threading.h"
enum{
workToDoNow = 1,
workNotToDoNow = 0
};
@implementation threading
-(id)init{
if (self = [super init]) {
theConditionLock = [[NSConditionLock alloc]initWithCondition:workNotToDoNow];
workItems = [[NSMutableArray alloc]init];
}
return self;
}
-(void)startDoingWork{
[NSThread detachNewThreadSelector:@selector(doBackgroundWork) toTarget:self withObject:nil];
}
-(void)doBackgroundWork{
while (YES) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];
NSArray* items = nil;
NSLog(@"Going to lock!!");
[theConditionLock lockWhenCondition:workToDoNow];
items = [NSArray arrayWithArray:workItems];
[workItems removeAllObjects];
[theConditionLock unlockWithCondition:workNotToDoNow];
NSLog(@"Finished the work!!");
[pool drain];
}
}
-(void)notifyBackgroundThreadAboutNewWork{
NSLog(@"Into the Background new work!!");
[theConditionLock lock];
[workItems addObject:@"Hello"];
[theConditionLock unlockWithCondition:workToDoNow];
NSLog(@"Finished and came out!!");
}
@end
main.m
------
#import <Foundation/Foundation.h>
#import "threading.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
threading* threads = [[threading alloc]init];
[threads notifyBackgroundThreadAboutNewWork];
[threads startDoingWork];
[pool drain];
return 0;
}
the detachNewThread:selector:toTarget:withObject method does not get called when debugged.
Isn’t it that your main ends that fast that the background thread has no chance to start? You know, before even the runtime manages to set up and start new thread, the app is finished and all the threads are killed/closed/whatever. You can put the main thread to sleep for a second to see if the background threads starts running.