Size: a a a

2020 June 03

R

Roma in iOS Fathers
Реалм должен быть один на поток. Видимо, self.realm вызвал где-то до транзакции в другом потоке
источник

YA

Yuriy 🐥 Aliev in iOS Fathers
Объекты Realm не являются потокобезопасными и не могут быть разделены между потоками, поэтому необходимо получить экземпляр Realm в каждой очереди потока/диспетчеризации, в которой требуется выполнить чтение или запись.

у тебя проблема с объектом который ты используешь в таске
источник

YA

Yuriy 🐥 Aliev in iOS Fathers
TRUploadModel это твой внутренний класс ведь?
источник

IG

Ivan Gaydamakin in iOS Fathers
Yuriy 🐥 Aliev
TRUploadModel это твой внутренний класс ведь?
ага
источник

IG

Ivan Gaydamakin in iOS Fathers
- (TRUploadModel *)uploadWorkerRequestNewJob:(TRUploadWorker *)uploadWorker
{
//    TODO: implemented to return not finished jobs?
//    TODO: hmm, maybe better to return array? Will analyze this
   
RLMResults<__kindof RLMObject *> *tasks = [TRUploadModel objectsInRealm:self.realm where:@"status == 0"];
   if (tasks.count == 0)
       return nil;
   __kindof RLMObject *task = tasks.firstObject;
   LOG(@"TRUploadManager: found task: %@", task);
   return task;
}

кроч туть проблема
источник

IG

Ivan Gaydamakin in iOS Fathers
это вызывается в другом потоке и поэтому всё идет по тому самому месту
источник

YA

Yuriy 🐥 Aliev in iOS Fathers
тебе бы эту таску предварительно получить в потоке self.dispatchQueue а потом уже с ней работать
источник

IG

Ivan Gaydamakin in iOS Fathers
Yuriy 🐥 Aliev
тебе бы эту таску предварительно получить в потоке self.dispatchQueue а потом уже с ней работать
ага, я понял
источник

IG

Ivan Gaydamakin in iOS Fathers
бля у меня тут еще война такая, получается я таску передаю воркеру и он будте в таске делает изменение в проперти и отдает обратно менеджеру эту таску мол шоб обновил в БД
источник

IG

Ivan Gaydamakin in iOS Fathers
но мне кажется это уже хуйня какая то
источник

IG

Ivan Gaydamakin in iOS Fathers
- (TRUploadModel *)processTask
{
   TRUploadModel *task = [self.delegate uploadWorkerRequestNewJob:self];
   LOG(@"TRUploadWorker: processing task: %@", task);
   if (task) {
       task.status = TRUploadModelStatusDone;
       [self.delegate uploadWorker:self taskUpdated:task];
   }
   return task;
}


это уже в воркере
источник

R

Roma in iOS Fathers
Делегат ещё наверное на мейн потоке каком?
источник

IG

Ivan Gaydamakin in iOS Fathers
Roma
Делегат ещё наверное на мейн потоке каком?
не, воркер создается внутри мэнэджера
источник

YA

Yuriy 🐥 Aliev in iOS Fathers
в теории ты можешь только вот это
RLMResults<__kindof RLMObject *> *tasks = [TRUploadModel objectsInRealm:self.realm where:@"status == 0"];

вызвать в правильном потоке, но это тебя запутает очень сильно
источник

IG

Ivan Gaydamakin in iOS Fathers
Yuriy 🐥 Aliev
в теории ты можешь только вот это
RLMResults<__kindof RLMObject *> *tasks = [TRUploadModel objectsInRealm:self.realm where:@"status == 0"];

вызвать в правильном потоке, но это тебя запутает очень сильно
моя говно архитектура видимо не готова к такому...  кек
источник

IG

Ivan Gaydamakin in iOS Fathers
Yuriy 🐥 Aliev
в теории ты можешь только вот это
RLMResults<__kindof RLMObject *> *tasks = [TRUploadModel objectsInRealm:self.realm where:@"status == 0"];

вызвать в правильном потоке, но это тебя запутает очень сильно
- (TRUploadModel *)uploadWorkerRequestNewJob:(TRUploadWorker *)uploadWorker
{
//    TODO: implemented to return not finished jobs?
//    TODO: hmm, maybe better to return array? Will analyze this

   __block __kindof RLMObject *task = nil;
       dispatch_async(self.dispatchQueue, ^{
           RLMResults<__kindof RLMObject *> *tasks = [TRUploadModel objectsInRealm:self.realm where:@"status == 0"];
           if (tasks.count == 0)
               return;
           task = tasks.firstObject;
           LOG(@"TRUploadManager: found task: %@", task);
       });
   return task;
}


ну так даже не крешнуло
источник

IG

Ivan Gaydamakin in iOS Fathers
источник

R

Roma in iOS Fathers
У тебя там не всегда нил возвращаться будет случаем?
источник

YA

Yuriy 🐥 Aliev in iOS Fathers
так тебе нужно dispatchGroup например
чтобы дождаться пока асинхронно выполнится получение результата, а только потом return вызовится
источник

ВК

Виталий Кудрин... in iOS Fathers
Ivan Gaydamakin
кароч такая хуета.
- (NSString *)addTask:(TRUploadModel *)task
{
   LOG(@"TRUploadManager: addTask: %@", task);
   dispatch_async(self.dispatchQueue, ^{
       [self.realm transactionWithBlock:^{
           [self.realm addObject:task];
           [self.worker addedNewTask];
//            LOG(@"TRUploadManager: addTask realm: %@", [TRUploadModel allObjectsInRealm:self.realm]);
       }];
   });
   return task.uuid;
}

- (RLMRealm *)realm
{
//    static RLMRealm *sharedInstance = nil;
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
       RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
       config.fileURL = [[[config.fileURL URLByDeletingLastPathComponent]
               URLByAppendingPathComponent:@"upload_manager"]
               URLByAppendingPathExtension:@"realm"];
       config.objectClasses = @[TRUploadModel.class, TRUploadModelContent.class];
       return [RLMRealm realmWithConfiguration:config error:nil];
//    });
//    return sharedInstance;
}

и в addTask бывает проскакивает эксепшен мол реалм на другом треде, хуй знает почему
так нельзя делать
источник