#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 поступают в метод делегирования