Вопрос: Какова предпочтительная/лучшая/принятая практика передачи данных (помимо примитивов) в фоновое задание с использованием Grand Central Dispatch (GCD)?Лучший способ передать объекты данных в Grand Central Dispatch Task
Что касается меня с объективными блоками C, то это: Переменные, к которым обращается блок, копируются в структуру данных блока в куче, так что блок может получить к ним доступ позже. Скопированные ссылки указателей могут означать, что несколько потоков обращаются к одному и тому же объекту.
Я до сих пор довольно новичок в объектах C и iOS, но я не новые потоки (C++, Java, C, C#).
код набор # 1 (Примитивный Копирование из объема)
//Primitive int
int taskIdBlock = self->taskNumber;
//declare a block that takes in an ID and sleep time.
void (^runTask)(int taskId, int sleepTime);
//Create and assign the block
runTask = ^void(int taskId, int sleepTime)
{
NSLog(@"Running Task: %d", taskId);
// wait for x seconds before completing this method
[NSThread sleepForTimeInterval:sleepTime];
//update the main UI
//tell the main thread we are finished with this task.
dispatch_async(dispatch_get_main_queue(),^
{
NSLog(@"Completed Task %d",taskId);
});
};
//Get the global concurrent dispatch queue and launch a few tasks
dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//TASK #1
//increment the task number and log
NSLog(@"Create Task Number %d", ++taskIdBlock);
//dispatch the task to the global queue.
dispatch_async(globalConcurrentQueue, ^{
runTask(taskIdBlock,5);
});
//TASK #2
//increment the task number and log
NSLog(@"Create Task Number %d", ++taskIdBlock);
//dispatch the task to the global queue.
dispatch_async(globalConcurrentQueue, ^{
runTask(taskIdBlock,3);
});
Выход:
Create Task Number 1
Create Task Number 2
Running Task: 1
Running Task: 2
Completed Task 2
Completed Task 1
код установлен # 2 (Object Reference Copy из области)
//Integer Object
NSInteger *taskIdBlock = &(self->taskNumber);
//declare a block that takes in an ID and sleep time.
void (^runTask)(int taskId, int sleepTime);
//Create and assign the block
runTask = ^void(int taskId, int sleepTime)
{
NSLog(@"Running Task: %d", taskId);
// wait for x seconds before completing this method
[NSThread sleepForTimeInterval:sleepTime];
//update the main UI
//tell the main thread we are finished with this task.
dispatch_async(dispatch_get_main_queue(),^
{
NSLog(@"Completed Task %d",taskId);
});
};
//Get the global concurrent dispatch queue and launch a few tasks
dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//TASK #1
//increment the task number and log
NSLog(@"Create Task Number %d", ++(*taskIdBlock));
//dispatch the task to the global queue.
dispatch_async(globalConcurrentQueue, ^{
runTask(*taskIdBlock,5);
});
//TASK #2
//increment the task number and log
NSLog(@"Create Task Number %d", ++(*taskIdBlock));
//dispatch the task to the global queue.
dispatch_async(globalConcurrentQueue, ^{
runTask(*taskIdBlock,3);
});
Выход:
Create Task Number 1
Running Task: 2
Create Task Number 2
Running Task: 2
Completed Task 2
Completed Task 2
Обратите внимание на первую строку в каждом фрагменте кода. Примитив int для объекта NSinteger. Мне бы хотелось увидеть что-то вроде этого:
dispatch_async(globalConcurrentQueue,runTask(*taskIdBlock,3));
Однако это не скомпилировано. Я могу только видеть, что это становится более трудным в будущем, поэтому лучше всего получить твердый пример. Заранее спасибо.
Спасибо за ответ. Я быстро использовал NSInteger, думая, что это объект, а не typedef. То, что вы ставите, имеет смысл. Я должен начать видеть задачи как «внутренние потоки в Java». С нетерпением ждем, если кто-нибудь еще получит какие-либо рекомендации. – LEO