Различать вызовы одного и того же метода делегирования

#objective-c #ios #cocoa-touch #delegates

#objective-c #iOS #cocoa-touch #делегаты

Вопрос:

Давайте представим, что у меня есть метод: -[myClass getDataForUser:user] и когда это сделано, он вызывает метод делегата gotData: , и результаты отображаются в моем основном классе. Если я выполняю два вызова getDataForUser: , например:

 [myClass getDataForUser:@"user1"];
[myClass getDataForUser:@"user2"];
  

как я могу различать эти два вызова в методе делегирования?

Редактировать:

Библиотека — MGTwitterEngine, два вызова, которые я делаю -[_engine getDirectMessagesSinceID:1 startingAtPage:1]; , и [_engine getSentDirectMessagesSinceID:1 startingAtPage:1]; и метод делегирования directMessagesReceived:forRequest:

Ответ №1:

Используйте экземпляр MGTwitterEngine для каждого вызова и присваивайте каждому экземпляру отдельный объект делегирования. Внутри каждого из этих объектов делегата вы можете хранить идентификатор пользователя. Установите эти объекты-делегаты, чтобы они могли принимать ваш исходный класс в качестве своих делегатов. Затем вы можете использовать делегат gotData:(id)data forUser:(NSString *)user наконец. Не очень красиво, но может сработать.

Ответ №2:

Добавьте аргумент в метод делегата:

 [delegate gotData:(id)data forUser:(NSString *)user]
  

Есть и другие способы, но не такие чистые и простые

Редактировать: хорошо, он находится в библиотеке, поэтому его нельзя изменить. Однако for[something] в этом случае у делегата есть аргумент forRequest . Итак, все, что вам нужно сделать, это найти способ связать запрос с именем пользователя. Я предлагаю поместить их в map, сопоставив request с user . Или, если у вас есть только два, вы можете просто создать пару переменных request1, request2 user1, user2 и сохранить запрос и пользователя в соответствующих переменных, проверяя, какой идентификатор соответствует какому имени (в делегате):

 if(thisRequest == request1) {
    thisUser = user1; 
} else {
    thisUser = user2;
}
  

Комментарии:

1. да, но имейте в виду, что делегат класса — это класс, который я не могу редактировать (класс или библиотека — MGTwitterEngine , а методы — [_engine getDirectMessagesSinceID:1 startingAtPage:1]; and [_engine getSentDirectMessagesSinceID:1 startingAtPage:1]; )

2. Гарантируется ли вызов метода делегирования до getData возврата вызова или он асинхронный?

3. Данные getData поступают в метод делегирования