ну, вы можете изменить способ, которым вы делаете свою помощницу по обновлению .. Я предлагаю вам использовать findOne (), а затем использовать update для вашего Пользователя, потому что при этом вы имеете больший контроль над обновлением, чем просто с помощью update .. так что попробуйте вот так
UploadImage(req, res) {
User.findOne({ _id: req.user._id })
.then((user) => {
if (user) {
if (user.images.type.length <= 4) {
cloudinary.uploader.upload(req.body.image, async result => {
user.image.type.push({ imgId: result.public_id, imgVersion: result.version });
user.save()
.then(res.status(HttpStatus.OK).json({ message: 'Image uploaded successfully' }))
.catch(); //use callback inside save() or use it like promise
});
}
} else { res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error uploading image' }); }
})
.catch(err => res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error uploading image' }));
}
, сделав это так, вы можете достичь того, что вы ищете .. ура :))
Это - то, для чего селектор Objective C: http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/NSInvocationOperation_Class
API не очень интуитивен, но его штраф, после того как Вы понимаете это
Вы, возможно, должны были бы сделать некоторый рефакторинг также, теперь мог бы быть лучший путь, но когда у меня была эта проблема, мое решение состояло в том, чтобы осуществить рефакторинг и использовать InvoationOperation.
Обычно обратные вызовы в Objective C обрабатываются путем передачи объекта делегата и селектора для выполнения на том делегате. Например, этот метод назовет метод на своем делегате после входа сообщения, передавая и его и сообщение, которое было зарегистрировано.
- (void)logMessage:(NSString *)message
delegate:(id)delegate
didLogSelector:(SEL)didLogSelector
{
NSLog(@"%@", message);
if (delegate && didLogSelector && [delegate respondsToSelector:didLogSelector]) {
(void) [delegate performSelector:didLogSelector
withObject:self
withObject:message];
}
}
Вы могли бы назвать его в коде как это:
- (void)sayHello
{
[logger logMessage:@"Hello, world"
delegate:self
didLogSelector:@selector(messageLogger:didLogMessage:)];
}
- (void)messageLogger:(id)logger
didLogMessage:(NSString *)message
{
NSLog(@"Message logger %@ logged message '%@'", logger, message);
}
Можно также использовать objc_msgSend()
непосредственно вместо этого, хотя необходимо понять достаточно время выполнения Objective C для выбора, какой вариант использовать и как создать прототип и указатель функции, через который можно назвать его. (Это - механизм, которым отправляет сообщение, на самом деле реализованы в Objective C — что компилятор обычно генерирует вызовы к тому, для представления []
выражения.)
Ваши проблемы конкретно со стандартными программами обратного вызова IOKit? Проблема с определенным примером, который Вы дали, состоит в том, что IOServiceMatchingCallback берет только 2 параметра, не 3. Вам нужен Ваш RawDeviceAdded () и BulkTestDeviceAdded () функции обратного вызова, чтобы соответствовать прототипу IOServiceMatchingCallback и принять сам как первый параметр (refCon), не 3-е. Кроме того, необходимо передать в сам как предпоследний параметр IOServiceAddMatchingNotification () для пасования назад его Вам обратным вызовом.
Общепринятая методика для обработки C обратные вызовы в коде Objective C должна только иметь статическую функцию что вперед обратный вызов к Вашему экземпляру. Так, Ваш код обратного вызова в качестве примера был бы похож на это:
static RawDeviceAdded(void* refcon, io_iterator_t iterator)
{
[(MyClass*)refcon rawDeviceAdded:iterator];
}
@implementation MyClass
- (void)setupCallbacks
{
// ... all preceding setup snipped
kr = IOServiceAddMatchingNotification(gNotifyPort,kIOFirstMatchNotification, matchingDict,RawDeviceAdded,(void*)self,&gRawAddedIter );
// call the callback method once to 'arm' the iterator
[self rawDeviceAdded:gRawAddedIterator];
}
- (void)rawDeviceAdded:(io_iterator_t)iterator
{
// take care of the iterator here, making sure to complete iteration to re-arm it
}
@end