Пример http-клиента esp8266

Ответы выше, все круто, но все они пропустили одно. group выполняет задачи (блоки) в потоке, в который он был введен, когда вы используете dispatch_group_enter / dispatch_group_leave.

- (IBAction)buttonAction:(id)sender {
      dispatch_queue_t demoQueue = dispatch_queue_create("com.demo.group", DISPATCH_QUEUE_CONCURRENT);
      dispatch_async(demoQueue, ^{
        dispatch_group_t demoGroup = dispatch_group_create();
        for(int i = 0; i < 10; i++) {
          dispatch_group_enter(demoGroup);
          [self testMethod:i
                     block:^{
                       dispatch_group_leave(demoGroup);
                     }];
        }

        dispatch_group_notify(demoGroup, dispatch_get_main_queue(), ^{
          NSLog(@"All group tasks are done!");
        });
      });
    }

    - (void)testMethod:(NSInteger)index block:(void(^)(void))completeBlock {
      NSLog(@"Group task started...%ld", index);
      NSLog(@"Current thread is %@ thread", [NSThread isMainThread] ? @"main" : @"not main");
      [NSThread sleepForTimeInterval:1.f];

      if(completeBlock) {
        completeBlock();
      }
    }

выполняется в созданной параллельной очереди demoQueue. Если я не создаю какую-либо очередь, она запускается в основном потоке.

- (IBAction)buttonAction:(id)sender {
    dispatch_group_t demoGroup = dispatch_group_create();
    for(int i = 0; i < 10; i++) {
      dispatch_group_enter(demoGroup);
      [self testMethod:i
                 block:^{
                   dispatch_group_leave(demoGroup);
                 }];
    }

    dispatch_group_notify(demoGroup, dispatch_get_main_queue(), ^{
      NSLog(@"All group tasks are done!");
    });
    }

    - (void)testMethod:(NSInteger)index block:(void(^)(void))completeBlock {
      NSLog(@"Group task started...%ld", index);
      NSLog(@"Current thread is %@ thread", [NSThread isMainThread] ? @"main" : @"not main");
      [NSThread sleepForTimeInterval:1.f];

      if(completeBlock) {
        completeBlock();
      }
    }

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

- (IBAction)buttonAction:(id)sender {
      dispatch_queue_t demoQueue = dispatch_queue_create("com.demo.group", DISPATCH_QUEUE_CONCURRENT);
      //  dispatch_async(demoQueue, ^{
      __weak ViewController* weakSelf = self;
      dispatch_group_t demoGroup = dispatch_group_create();
      for(int i = 0; i < 10; i++) {
        dispatch_group_enter(demoGroup);
        dispatch_async(demoQueue, ^{
          [weakSelf testMethod:i
                         block:^{
                           dispatch_group_leave(demoGroup);
                         }];
        });
      }

      dispatch_group_notify(demoGroup, dispatch_get_main_queue(), ^{
        NSLog(@"All group tasks are done!");
      });
      //  });
    }

Конечно, поскольку Вы можете использовать dispatch_group_async, чтобы получить то, что хотите.

0
задан Onur A. 9 March 2019 в 18:37
поделиться

2 ответа

На самом деле, когда я хочу отправить его в arduino nano, он выдает мне ошибку: нет подходящей функции для вызова HardwareSerial::write(String&)

, я мог бы исправить ошибку с помощью этого примера кода

String mystring= http.getString();

  char* buf = (char*) malloc(sizeof(char)*myString.length()+1);
  myString.toCharArray(buf, myString.length()+1);
  Serial.write(buf);
  free(buf);
[ 114] но модуль esp8266 не может сравнить полезную нагрузку с моим текстом

0
ответ дан swatchai 9 March 2019 в 18:37
поделиться

Если светодиод был включен, то метод сравнения определенно работал. Попробуйте отправить другую строку с сервера, ваш светодиод должен быть выключен. А также, когда у вас возникли подобные проблемы, попробуйте распечатать «полезную нагрузку» на последовательном мониторе. По крайней мере, вы можете выяснить, где находится неисправность.

надеюсь, что это поможет.

0
ответ дан wachid susilo 9 March 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: