change to use NSOperationQueue